对二级指针的理解

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

posted @ 2020-06-24 09:15  行路难,多歧路  阅读(482)  评论(0)    收藏  举报