对二级指针的理解
C语言中指针是非常重要的一个概念。在编程中合理使用指针,对代码的逻辑和可读性都非常有帮助。
对二级指针的理解我们可以先从它的应用讲起,在讲之前我们先回顾一下指针的一个实际应用:函数的参数传递,并且能改变参数的值。
先看如下代码所示:
#include <stdio.h> void fun(int a) { a = 10; } int main(void) { int temp = 1; printf("temp = %d\n",temp); fun(temp); printf("temp = %d\n",temp); return 0; }
我们看一下输出的结果:
temp = 1
temp = 1
我们先回顾一下函数实参传递的过程,当调用函数fun()并传入实参temp时,函数fun()在其栈空间上定义一个与实参类型(int)相同的变量并初始化这个变量为实参的值(1),其实就是新建一个实参的副本(暂且记为x)。那么问题来了,如果在函数fun()中改变了副本x,但实参temp是没有发生改变的,并且当函数fun()执行完毕后副本x也将随之释放。
当我们想在一个函数里面改变一个变量的值时,我们不能把这个变量直接做为参数传过去,这时我们就需要用到指针变量了,我们先看一下如下代码:
#include <stdio.h> void fun(int *a) { *a = 10; } int main(void) { int temp = 1; printf("temp = %d\n",temp); fun(&temp); printf("temp = %d\n",temp); return 0; }
输出的结果:
temp = 1
temp = 10
我们把函数fun()的参数改为一个指向int型的指针变量,对*a赋值其实就是对指向实参的地址赋值,即对temp赋值。这样就达到了在一个函数里面改变一个变量的值的目的。
类似的道理,如果我们想在一个函数里面改变一个指针变量的值,即改变这个指针变量所指向的地址,那就应该在原来指针变量的基础上再加一级指针,所以这就有了二级指针。如下代码分析:
#include <stdio.h> void fun(int *a,int *temp) { a = temp; } int main(void) { int temp1 = 10; int temp2 = 20; int *p = &temp1; printf("*p = %d\n",*p); fun(p, &temp2); printf("*p = %d\n",*p); return 0; }
输出的结果:
*p = 10
*p = 10
当我们使用二级指针对指针变量进行赋值时:
#include <stdio.h> void fun(int **a,int *temp) { *a = temp; } int main(void) { int temp1 = 10; int temp2 = 20; int *p = &temp1; printf("*p = %d\n",*p); fun(&p, &temp2); printf("*p = %d\n",*p); return 0; }
这时输出的结果就是我们想要的结果了:
*p = 10
*p = 20
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
二级指针在C语言实现的数据结构中会经常使用,我这里主要是以参数传递为切入点理解二级指针。

浙公网安备 33010602011771号