目录
前言:
在做项目实习项目的时候,发现有使用到双指针,只知道用法,但是没有理解其原理是什么,今天来总结一下,算是实习的一个小总结吧。
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;实际上这里和第一个用法一致,通过双重指针,改变一维指针的指向。
//新指针可以用结构体的指针变量,自己实践实践就知道了