双重指针的用法

目录

前言:

 1、双重指针的定义:

 2、双重指针的传参

 3、代码进行验证

 4、用法总结

 5、拓展双重指针第二个用法

前言:

在做项目实习项目的时候,发现有使用到双指针,只知道用法,但是没有理解其原理是什么,今天来总结一下,算是实习的一个小总结吧。

1、双重指针的定义:

首先得明白指针是什么,指针就是地址。

找到地址就可以知道它里面储存什么数据。

双重指针的定义是指向指针数据的指针变量,简单来说指向指针的指针。

作用:改变一维指针的指向。

2、双重指针的传参

2.1 首先,在代码中,在函数调用里面,我们一般这样利用双重指针传参 void  fun(int **pa),

2.2 具体还得看是什么数据类型,这里用int,来举个例子。

        int a = 1;

        int *p = &a;

指针就是地址,变量p的值就是变量a的地址,p的值就是0x11,他们的关系如下图所示:

 2.3 在调用函数传参的时候,我们想改变指针p的指向,假设我们也传入一维指针的话,是改变不了的,因为现在p就是一维指针,想要改变它的指向,只有传入双重指针才可以改变它的指向。

调用函数void fun(int **pa),将指针的地址&p传入,此时pa=&p;pa的值就是0x22,它们的关系如下图所示:

 3、代码进行验证

3.1 调用fun函数,来改变指针p的指向,代码如下:

#include <stdio.h>

void fun(int** pa)
{
	int b = 100;
	*pa = &b;
	printf("pa的值: %p\n", pa);
	printf("*pa的值: %p\n", *pa);
	printf("&b的值: %p\n", &b);
	printf("**pa的值: %d\n",**pa);

}

int main(viod)
{
	int a = 1;
	int* p = &a;
	printf("*p的值:%d\n", *p);
	printf("p的值:%p\n", p);
	printf("&a的值:%p\n",&a);
	printf("&p的值:%p\n", &p);
	fun(&p);
	

	if (p != 0)
	{
		printf("改变后输出*p = %d", *p);
	}


}

3.2 代码运行,结果分析

首先,从主函数main,定义了一个变量a,值为1,定义指针p,指向a的地址&a;

然后开始对指针p进行解引用*p = 1;p的指向和&a的值一样,p=&a

 其次,指针p的地址传给函数fun(int **pa),此时pa=&p。

接下来,改变p的指向,对双重指针进行解引用即可,*pa=&b;此时p的指向已经改变,已经改为b的地址,即p=&b。

此时,对指针p进行解引用就可以知道存储的数据是什么,**pa=100,也就是*p=100。

3.3 指针的关系发生改变

本来一维指针p指向变量a的地址,使用双重指针改变一维指针p的指向变量b的地址,关系如下图所示:

 可以发现,一维指针p的指向已经发生了改变。

4、用法总结

(1)一维指针的定义int *p=NULL p=&a;或者直接指向某个变量的地址int *p=&a。

指向的意思就是说,指针p的值就是这个地址。

(2)双重指针的定义int **pa,想要改变一维指针的指向的时候,就可以把p的地址传给pa,即pa=&p。

(3)双重指针的解引用*pa=p,此时是一个存储变量的地址;**pa=*p,此时就是存储变量具体的值,如本次例子的b的值100。

5、拓展双重指针第二个用法

5.1 利用双重指针直接改变具体存储的值,代码改动如下图所示,可以改变值。

#include <stdio.h>

void fun(int** pa)
{
	** pa= **pa+1;
	printf("pa的值: %p\n", pa);
	printf("*pa的值: %p\n", *pa);
	printf("**pa的值: %d\n",**pa);

}

int main(viod)
{
	int a = 1;
	int* p = &a;
	printf("*p的值:%d\n", *p);
	printf("p的值:%p\n", p);
	printf("&a的值:%p\n",&a);
	printf("&p的值:%p\n", &p);
	fun(&p);
	

	if (p != 0)
	{
		printf("改变后输出*p = %d", *p);
	}


}

5.2 代码运行结果

 可以看出直接就把a的值加1了,不用再加变量也可以改变a的值。

5.3 引用的函数里进行新的指针定义

新指针 int *q=NULL;利用新的指针可以进行一系列操作,可以结合结构体操作,最后把指针赋值给双重指针即可,q=*pa;实际上这里和第一个用法一致,通过双重指针,改变一维指针的指向。

//新指针可以用结构体的指针变量,自己实践实践就知道了

  • 9
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值