指针的指针

众所周知,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,原因是不能把 ** 类型转换成 * 类型。定义还是很严格的…

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值