在C中对变量名的理解是在变量定义时候,把某一区域的存储空间起一个别名(变量名),比如:double a; 如果我们是个好奇宝宝,我们可以通过&运算符来查看计算机具体把哪个存储空间取了别名a。
#includeint main(void) { double a; printf("%p",&a); return 0; }
输出结果:000000F81959FD90。说明把这个存储空间取了doublel类型的别名a。
同理:double * b
#includeint main(void) { double *b; printf("%p",&b); return 0; }
输出结果:00000019A7B1FD20。 说明把这个存储空间取了doublel类型指针的别名b。
重点来了。
下面来看:
#includeint main(void) { double **c; printf("%pn",c); double *b; printf("%pn",&b); printf("%pn",b); double a = 3.0; printf("%pn",&a); c=&b; // 将c指向存储b这一指针的地址,此时*c和b就是一个东西 printf("%pn",c); *c=&a; // 等效于b=&a。此时更改c里存储的值(一个地址,既是*c也是b所指的地址),也就是所现在b指向了a所对应的地址 printf("%pn",b); *b = 1.0;//等效与a=1.0 printf("%lf",a); return 0; }
输出结果:
45186D10D83DDBCD
000000A9D56FFC98
000000000000002F
000000A9D56FFC90
000000A9D56FFC98
000000A9D56FFC90
1.000000
这里的第一个结果和第三个结果其实都是不确定的,因为在一开始对二级指针和一级指针定义的时候没有给他们初始赋值,拿一级指针来说,double * b只是给这一空间(000000A9D56FFC98)取了一个double型指针的别名b,但是还没有给这一空间里存值(这里要存的值是地址,也即b指针应当指向哪个地址),所以第三个输出结果是不确定的。
总结:
给变量定义就是给某一存储空间取一个别名;
给定义好的变量赋值操作就是往这一空间里存值(对于普通变量就是数值字符之类;对应一级指针就是往这空间里存地址(给指针赋值的常用说法就是让指针指向想指的地址);对于二级指针同样是往这空间里存地址,但要注意,这里存的地址值所对应的存储空间里只能装一级指针的地址)



