【C语言】二级指针分析

假设有这样一段代码,p2(二级指针)指向p1(一级指针),p1指向a,a就是一个普通的整型变量,a的值为100。

void main(void)
{
	int a = 100;
	int *p1 = &a;
	int **p2 = &p1;
}

假设a的地址为0x0000,p1的地址为0x0004,p2的地址为0x0008,那么就有这样一个内存和值的映射表。

变量p2p1a
0x00040x0000100
地址0x00080x00040x0000
对一级指针p1取值,就是*p1=*(0x0000)=取地址0x0000的值=a=100
对二级指针p2取值,就是*p2=*(0x0004)=取地址0x0004的值=p1=0x0000

由此可以知道,*的结果就是前一级的值,那么这个有什么用呢?

假设我们有这样一个需求,就是在函数内部为一个指针分配内存,并且要在函数外部生效。这时候就需要用到二级指针了。

#include "stdio.h"
#include "stdlib.h"

int a = 100;//全局变量a
void malloc_p(int **p2)//二级指针p2
{	
	*p2 = &a;
}

int main(void)
{
	int *p1 = NULL;//一级指针p1
	
	malloc_p(&p1);

	printf("*p1 = %d\r\n", *p1);

	return 0;
}

这一段代码的作用是什么呢?其实就是将p2,p1和a进行绑定。

我们来分析一下,按照代码的运行过程,首先

int a = 100;
mina函数里面的int *p1 = NULL;
函数里面的int **p2

因此内存关系就是这样,这时候p2,p1,a之间还没有建立任何联系,他们彼此独立。

变量p2p1a
未知NULL100
地址0x00080x00040x0000

当调用malloc_p(&p1)函数时,其实就是int **p2 = &p1;
这时候建立了p1和p2的关系,p2存放的是p1的地址,*p2就是p1的值。

变量p2p1a
0x0004NULL100
地址0x00080x00040x0000

当执行*p2 = &a;语句后,其实是*p2 = p1 = &a;
这时候就建立了p2,p1和a之间的关系

变量p2p1a
0x00040x0000100
地址0x00080x00040x0000

最后,在函数malloc_p(&p1)运行完成以后,就可以通过p1来操作a的那块内存了。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值