对二级指针的理解

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语言实现的数据结构中会经常使用,我这里主要是以参数传递为切入点理解二级指针。

猜你喜欢

转载自www.cnblogs.com/jank/p/12906783.html