C语言这门课程里,初次接触到指针这一章节时,对于指针的理解我很模糊,所以就通过程序和调试来加深对指针的理解。
Int a = 10;
Int *p = &a;
1.为了理解p和*p到底代表了什么,调试得到如下结果:
可以看到,指针变量p的值和变量a的地址相同,*p等于变量a的值。也就是说,指针等同于一个地址,解引用(*p)为该地址上内存单元存储的的值(a)。
在此基础上,又有两个新问题:
(1)解引用的改变,会对变量a产生影响吗?测试如下:
int a = 10;
int *p = &a;
*p = 100;
结果如下:
显而易见,*p赋值为100后,变量a的值也变为了100。
(2)改变指针变量p的指向,*p会变化吗?测试如下:
int a = 10;
int *p = &a;
int b = 20;
p = &b;
结果如下:
可以看到指针变量p指向了变量b,并且*p也变为了变量b的值。
2.既然指针变量p储存了变量a的地址,那么指针变量p也是有地址的,可以定义一个二级指针变量*pp指向指针变量p:
Int b = 20;
Int *p = &b;
Int **pp = &p;
结果如下:
二级指针变量*pp的解引用**pp为变量b的值。
3.那么二级指针变量*pp的改变,会影响指针变量p吗?测试如下:
Int b = 20;
Int a = 10;
Int *p = &b;
Int **pp = &p;
*pp = &a;
结果如下:
可以看到二级指针变量*pp指向变量a后,指针变量p也指向了变量a,并且解引用*p和**pp也都变为了变量a的值:10。