首页 > 编程笔记 > C语言笔记 阅读:17

C语言二级指针(多级指针)的用法(非常详细,附带实例)

在 C语言程序中,指针用于存储目标数据对象的首地址和数据类型。那么,这个目标数据对象能否也是一个指针,即一个指针变量存储的是另一个指针变量的地址?

我们可以尝试对一个指针再次取地址,看看是否能够编译通过:
#include <stdio.h>
int main()
{
    int n = 123;
    int *pn = &n;
    printf("pn = %llu\n", pn);
    printf("&pn = %llu\n", &pn);
    return 0;
}
编译成功后,运行结果为:

pn = 6487580
&pn = 6487568

我们对整型变量 n 取地址,获得一个 int* 类型的指针,并将指针存储到指针变量 pn 中。然后,我们对 pn 取地址。从运行结果中可以看到,对 pn 取地址确实还可以获得一个指针。

这个示例证明了指针变量也可以有自己的地址,因此可以用一个指针变量来存储另一个指针变量的地址。

C语言二级指针(指针的指针)

在前面的内容中,我们学习了一级指针,即指向一个变量的指针。例如,int *p指向一个整型变量。

指针的指针也称为二级指针,是一个指向另一个指针的指针。例如,int **pp指向一个整型指针变量。

以此类推,还可以有三级指针、四级指针等,统称为多级指针。声明多级指针时,需要在变量名前添加相应数量的星号。例如:
int **pp;    // 二级指针声明
int ***ppp;  // 三级指针声明

初始化多级指针时,需要确保指针的级别与目标地址的级别一致。例如:
int a = 10;
int *p = &a;       // 一级指针初始化
int **pp = &p;     // 二级指针初始化
int ***ppp = &pp;  // 三级指针初始化

和一级指针一样,多级指针也可以使用取值运算符*来获取目标数据对象,例如:
#include <stdio.h>
int main()
{
    int n = 123;
    int *pn = &n;
    int **pnn = &pn;
    printf("**pnn = %d\n", **pnn);
    return 0;
}
运行结果为:

**pnn = 123

上述代码首先使用取地址运算符获得变量 n 的指针 pn,类型为 int *,然后使用取地址运算符获得 pn 的指针 pnn,类型为 int **

取值过程也比较简单,pnn 使用取值运算符将 int ** 还原为 int **pnn 使用取值运算符将 int * 还原为 int,即还原为 n。因此,程序能够通过二级指针获取变量 n 的值。

我们将问题复杂化一点:
#include <stdio.h>
int main()
{
    int n = 123;
    int *oneStar = &n;
    int **twoStar = &oneStar;
    int ***threeStar = &twoStar;
    int ****fourStar = &threeStar;
    int *****fiveStar = &fourStar;
    // 五次取值,还原为 int
    printf("n = %d\n", *****fiveStar);
    return 0;
}
这段代码首先创建了一个整型变量 n,然后依次创建了一级到五级的指针,每个指针都指向上一级指针。最后,这段代码使用五个 * 运算符来访问原始整型值 n,并使用 printf() 函数输出该值。运行结果为:

n = 123

C语言多级指针的应用

多级指针在 C语言中的应用非常广泛。下面我们讲解几个常见的多级指针的实际应用场景,并用具体的例子加以说明。

1) 修改指针的值

当需要在函数内修改指针的值时,可以使用多级指针作为函数参数。

例如,下面的实例代码演示了如何使用二级指针在函数内修改一级指针的值。
#include <stdio.h>
void changePointer(int **p) {
    int b = 20;
    *p = &b;
}

int main() {
    int a = 10;
    int *p = &a;
    changePointer(&p);
    printf("%d\n", *p); // 输出 20
    return 0;
}
注意,实例程序中的 changePointer() 函数将局部变量 b 的地址赋给了 p,这是不安全的做法,因为在函数返回后,局部变量会被销毁,导致 p 指向无效内存。这里仅为了演示多级指针的用法。

2) 函数返回多个值

通过使用二级指针作为函数参数,我们可以在函数内部交换两个指针所指向的内容。

如下是一个使用二级指针实现的交换两个整数的示例。
#include <stdio.h>
void swap(int **a, int **b) {
    int *temp = *a;
    *a = *b;
    *b = temp;
}

int main() {
    int x = 5;
    int y = 10;
    int *px = &x;
    int *py = &y;
    printf("交换前:x = %d, y = %d\n", *px, *py);
    swap(&px, &py);
    printf("交换后:x = %d, y = %d\n", *px, *py);
    return 0;
}
运行结果为:

交换前:x = 5, y = 10
交换后:x = 10, y = 5

总结

读完本文,你已经掌握了 C语言多级指针的基本用法,可以通过下面这道练习题加深对 C语言多级指针的理解。

【练习】实现一个函数,用于计算两个整数的和与差,并在 main() 函数中调用该函数。要求使用二级指针。
#include <stdio.h>
void sumAndDifference(int a, int b, int **sum, int **diff) {
    **sum = a + b;
    **diff = a - b;
}

int main() {
    int a = 5;
    int b = 3;
    int sum, diff;
    int *pSum = &sum;
    int *pDiff = &diff;
    sumAndDifference(a, b, &pSum, &pDiff);
    printf("和:%d,差:%d\n", sum, diff);
    return 0;
}
运行结果为:

和:8,差:2

相关文章