C语言 变量与指针 形象化解释
2013-07-10 19:03
302 查看
初学者可能觉得C语言指针难以理解,而指针的确是C的精华所在,所以必须弄清它的本质
我一直喜欢把程序设计抽象化的定义具体类比到实例来理解,这样更容易解释和说明,别人也容易听懂
这次先拿指针与引用开刀吧!我们把变量具体化成生活中的地址来解释
首先来个声明:
int stuAddr =
5;
int &hustStuAddr =
stuAddr;
printf("%s",&stuAddr); // 0x444ABCD
int *myAddr ;
myAddr =
&stuAddr;
printf("%s:%d",myAddr,*myAddr); // 0x4444ABCD:5
myAddr = NULL;
这段对一般人应该不难理解,而我想说的是把它与下面程序一一对应起来看(不妨假设华科只有沁苑学生宿舍,且不会变动)
地址 学生住址 =
“沁苑学生宿舍";
地址别名
华科学生住址 = 学生住址;
打印 学生住址 实际位置 // 湖北省武汉市珞瑜路1037号东区
地址指针
我的住址;
我的住址 =
&学生住址;
打印 我的住址:我的住址名称 // 湖北省武汉市珞瑜路1037号东区:沁苑学生宿舍
我的住址 = 空;
为什么会这样类比?
变量(即地址)是真实存在的,而指针(即我的住址)是抽象化的概念,是一种映射绑定关系,必须绑定变量才有意义
在声明一个变量后,它的地址就被分配和固定了,(一个小区在建立的时候,实际物理地址也是确定无法更改的)直到它被销毁
当变量的值改变,它的地址是不会变的。(或许若干年后,“沁苑学生宿舍”改成了“计算机学生宿舍”,而学生还是住在固定的位置)
在程序体内,我们可以用变量名称访问值,但是在其他程序中,只能通过地址访问其值
(在校内,我们可以直接用学生宿舍这一名称,但是对外面的人来说,必须告诉他们实际物理地址来找到沁苑)
这个例子也很好的阐释了指针和引用的差别
引用即“别名”,对引用的操作实际是对本身的操作,并且引用必须绑定在存在的类型上。(华科大不能没有学生宿舍吧!)
当需要用可改变对象的类型时,应当用指针,如上面的“我的住址”,单一指向对象则用引用,如“华科学生住址”(学校多投点钱修新宿舍吧……)
指针可以改变,可以为空,而引用不行(当我们毕业离校,“我的住址”也会变,甚至无家可归,而“华科学生住址”这个名称实际地址是不会变化的)
这个例子仅仅是为了表明“指针”的存在形式。实际上,程序中指针远比现实中要复杂,通过指针可以修改它指向的值,而且指针访问前需要检查非空性
我一直喜欢把程序设计抽象化的定义具体类比到实例来理解,这样更容易解释和说明,别人也容易听懂
这次先拿指针与引用开刀吧!我们把变量具体化成生活中的地址来解释
首先来个声明:
int stuAddr =
5;
int &hustStuAddr =
stuAddr;
printf("%s",&stuAddr); // 0x444ABCD
int *myAddr ;
myAddr =
&stuAddr;
printf("%s:%d",myAddr,*myAddr); // 0x4444ABCD:5
myAddr = NULL;
这段对一般人应该不难理解,而我想说的是把它与下面程序一一对应起来看(不妨假设华科只有沁苑学生宿舍,且不会变动)
地址 学生住址 =
“沁苑学生宿舍";
地址别名
华科学生住址 = 学生住址;
打印 学生住址 实际位置 // 湖北省武汉市珞瑜路1037号东区
地址指针
我的住址;
我的住址 =
&学生住址;
打印 我的住址:我的住址名称 // 湖北省武汉市珞瑜路1037号东区:沁苑学生宿舍
我的住址 = 空;
为什么会这样类比?
变量(即地址)是真实存在的,而指针(即我的住址)是抽象化的概念,是一种映射绑定关系,必须绑定变量才有意义
在声明一个变量后,它的地址就被分配和固定了,(一个小区在建立的时候,实际物理地址也是确定无法更改的)直到它被销毁
当变量的值改变,它的地址是不会变的。(或许若干年后,“沁苑学生宿舍”改成了“计算机学生宿舍”,而学生还是住在固定的位置)
在程序体内,我们可以用变量名称访问值,但是在其他程序中,只能通过地址访问其值
(在校内,我们可以直接用学生宿舍这一名称,但是对外面的人来说,必须告诉他们实际物理地址来找到沁苑)
这个例子也很好的阐释了指针和引用的差别
引用即“别名”,对引用的操作实际是对本身的操作,并且引用必须绑定在存在的类型上。(华科大不能没有学生宿舍吧!)
当需要用可改变对象的类型时,应当用指针,如上面的“我的住址”,单一指向对象则用引用,如“华科学生住址”(学校多投点钱修新宿舍吧……)
指针可以改变,可以为空,而引用不行(当我们毕业离校,“我的住址”也会变,甚至无家可归,而“华科学生住址”这个名称实际地址是不会变化的)
这个例子仅仅是为了表明“指针”的存在形式。实际上,程序中指针远比现实中要复杂,通过指针可以修改它指向的值,而且指针访问前需要检查非空性
相关文章推荐
- C语言中->、变量、指针、结构体的解释,通俗易懂!
- C语言 free 指针 变量内存分配
- C语言小结--指针和变量传参
- 20170214C语言提升08_指针_01变量及指针及数组
- C语言_结构体变量指针做函数参数的使用案例
- c语言用指针做函数参数和用变量做函数参数的不同点
- 20170214C语言提升08_指针_01变量及指针及数组
- C语言中结构体指针的成员变量访问
- c语言:字符串与字符串指针变量
- C语言有关指针的变量声明中的几个易错点
- 20170214C语言提升08_指针_01变量及指针及数组
- C语言易错点(函数里修改传入变量的值不会改变传入变量的指针)
- 3、C语言中一般类型的指针变量细解
- C语言学习笔记(6)-如何从变量声明的表面上来区分指针数组和数组指针
- C语言字符串指针变量与字符数组的区别
- 20170214C语言提升08_指针_01变量及指针及数组
- c语言中返回指向临时变量的指针的探讨
- C语言指针定义变量方式
- c语言中const 类型变量地址赋值给指针。
- 20170214C语言提升08_指针_01变量及指针及数组