众所周知,C语言中的指针就是变量的存储地址。当我们定义了一个变量,并赋值以后,这个值就会被存储到系统为他分配的内存中(其实是在程序被编译的时候才分配内存)。而系统中的内存就像酒店里的房间一样,是有编号的。这个编号,就是该变量的地址,即指针。
如果我们定义了一个指针变量p,它被赋值并存储在内存中。那么p作为一个变量,它的地址又怎么表示呢?
C语言为了解决这个问题引入了指针的指针这个定义,其定义语句如下
int **q; //定义一个指向(*q)的指针变量q
刚看到这种定义的方法的时候我就想,指针是普通变量的存储地址,指针的指针是指针变量的存储地址,指针的指针的指针是是指针的指针变量的存储地址……。这…这分明是递归定义的思想啊!
既然是递归定义的思想,那么指针的指针也可以用指针(*)来表示啊,为什么C语言却弄了一种新的定义(**),我百思不得其解,于是就写了个验证的代码,如下
#include<stdio.h>
int main()
{
int a=10;
int *p=&a,*q=&p;
int **h=&p; //对照组
printf("a的地址为:%d\n",*q);
printf("a的真实地址为:%d\n",p);
printf("p的地址为:%d\n",q);
printf("p的真实地址为:%d\n",h);
printf("a=%d\n",*p);
printf("a=%d\n",**h);
//printf("a=%d\n",**q); //发现有这条语句的时候错误,不能运行
return 0;
}
结果如图(来自手机截图…代码也是手机上测试运行的)
通过结果可以发现,确实可以用指针来获取和存储指针变量的地址,但是!!!它不能直接用于访问变量a!!!因为出现“ **q ”的时候会出错 ,不能运行。
后来我发现出错的原因是: ** 是C语言用来定义指针的指针变量的,而上面的代码并没有对 **q 的声明,因而出错。
面对这个结果,我实在是不甘心,于是又抖了一下激灵
#include<stdio.h>
int main()
{
int a=10;
int *p=&a,*q=&p,*f;
int **h=&p; //对照组
f=*q; //中间指针转换
printf("a的地址为:%d\n",*q);
printf("a的真实地址为:%d\n",p);
printf("p的地址为:%d\n",q);
printf("p的真实地址为:%d\n",h);
printf("a=%d\n",*p);
printf("a=%d\n",**h);
printf("a=%d\n",*f);
//printf("a=%d\n",**q); //发现有这条语句的时候错误,不能运行
return 0;
}
啊哈哈哈,结果如下图
可以引用了有没有!哈哈哈…
经过转换之后,可以用指针来存取并引用指针变量的地址,就是有些麻烦,且不如 ** 定义来的直观。想必这就是C语言不用上述递归定义的思想来定义指针的指针了。
虽然是个激灵,但希望能帮助到大家对指针的理解
注:上述代码不能再VC++ 6.0环境运行,出错语句是int *q,*p=&q
,原因是不能把 ** 类型转换成 * 类型。定义还是很严格的…