c中有二异性,一个变量有地址,有存储的值,所以a表示值,&a表示地址用以区分
a表示a对应的存储单元中的数据。
&a表示a对应的存储单元的地址。
*a表示:首先,要求a对应的存储单元中的数据一定是另一个存储单元的地址。 于是,*a表示另一个存储单元中的数据。*:根据地址取值。
int* a 表示a是个指针,存储地址,并且是int型,即地址对应取到的值是int
*在申明变量时表示该变量存储指针,在变量前表示取该变量中存储地址的值
***d可以连取,顺着指针往回走取到a
&&a没有这种用法,不能取到地址的地址,只能取变量的地址(指针不能倒着查找)
#include <stdio.h>
#define PI 3
int main() {
int a = 10;
int* b = &a;
int** c = &b;
int*** d = &c;
printf(" a是int变量 b c d都是int型指针\n b指向c,c指向b,b指向a\n\n");
printf(" a的值: % d\n", a);
printf(" &a,a的地址: % d\n\n", &a);
printf(" b的值,即a的地址: % d \n\n", b);
printf(" c的值,b的地址: % d\n\n", c);
printf(" *c即c存储地址的值,即b的值,即a的地址: % d\n", *c);
printf(" d的值,c的地址: % d\n\n", d);
printf(" &d d的地址,与以上无关: % d\n\n", &d);
printf(" *d即d存储地址的值,即c的值,即b的地址: % d,*d==c:%d ,c==&b:%d\n\n", *d, *d == c, c == &b);
printf(" ***d:根据指针往上取到a的值 % d,***d==a: %d\n\n", ***d, ***d==a);
printf("指针取其地址所对应的值,再取地址,肯定等于原指针保存的地址值\n\n");
printf(" b==&*b: % d\n", b==&*b);
printf(" b==&b: % d\n", b==&b);
}
左值:可修改的值
0x开头 16进制
0开头 8进制