指针(一级指针)是指向普通变量的指针(一级指针保存着普通变量的地址);
int *a = NULL; //空指针
int c = 5; //变量c现在保存着5(这么写是为了大家理解指针)
a = &c; //指针a指向变量c的地址(指针变量a现在保存着c的地址值)
执行完这三句,*a == 5
解释:*a表示对指针变量a进行解引用(找到a中保存的的地址,也就是变量c的地址,然后将此地址中的数据拿出来就是*a)
总结:
int *a = NULL;或者char *b = NULL;其实系统都会为指针变量a和b分配相应的内存空间,
且他俩分配的内存空间大小是一样的
,都是用来存储地址值,
&a表示指针变量a的地址,a表示a指向的变量的地址,*a表示a指向的变量的值
所有的
指针变量等于
指针变量的地址的解引用:a = *(&a); 因为*(&a)表示:地址&a中存储的值
以下再通过四个例子,让大家理解一下指针(每张图片中左侧为代码,右侧为运行结果)
1.
2.
解释说明:主函数中SB(&a),将变量a的地址传递给SB中的b(b指向a的地址)。
1中*b=c;表示将c的数值5赋给b指向的地址,所以*b=c=5,b指向变量a的地址,所以a=
*b=c=
5.
2中b=&c;表示将c的地址给b(b指向c的地址),所以b不再指向a的地址,所以*b=c=5,a=0。
3.
3中a是个指针变量,而且指向一个空地址,所以SB(a)是将一个空地址给b,
相当于指针变量a b都没有指向有效的地址,
所以进行*b=c,将c的值5传递给b的指向的地址,访问了b指向的地址就会程序崩溃。
4.
4与2比较类似,b本来指向a的地址(空地址),b=&c后,b指向c的地址,所以*b=c = 5;
又因为a是个指针变量,而且指向了一个空地址,所以不能进行解引用(不能访问a指向的地址)
所以执行*a,程序就会崩溃
就写这么多吧,欢迎大家指正!
3中a是个指针变量,而且指向一个空地址,所以SB(a)是将一个空地址给b,
相当于指针变量a b都没有指向有效的地址,
所以进行*b=c,将c的值5传递给b的指向的地址,访问了b指向的地址就会程序崩溃。