28 指针之指针与函数

在 C 语言中,指针是一个非常重要的概念,而指针之指针(即二级指针)更是一个高级应用。在这一篇中,我们将探讨指针之指针在与函数交互中扮演的角色,以及如何有效地使用它们。

指针之指针的理解

首先,回顾一下指针。指针是一个变量,它的值是另一个变量的地址。例如,假设我们有一个整型变量 x

1
2
int x = 10;
int *p = &x; // p 是一个指向 x 的指针

而指针之指针旨在指向另一个指针,即它的类型为 int **,它可以存储指向 int * 的指针。例如:

1
int **pp = &p; // pp 是一个指向指针 p 的指针

在这个例子中,pp 通过引用 p 来指向 x。这为我们对数据结构和动态内存分配提供了更多灵活性。

指针之指针与函数

理解指针之指针后,我们可以开始探讨它如何与函数结合,通常用于改变函数外部的变量值。以下是一个示例,演示如何使用指针之指针在函数中修改变量的值。

示例:使用指针之指针改变变量值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>

void changeValue(int **ptr) {
**ptr = 20; // 通过指针之指针改变原始变量的值
}

int main() {
int x = 10;
int *p = &x; // 指向 x 的指针
printf("Before: x = %d\n", x);

changeValue(&p); // 传入指向 p 的地址
printf("After: x = %d\n", x); // 将会显示 20

return 0;
}

在这个示例中,changeValue 函数接收一个 int **ptr 类型的参数。我们在 main 函数中声明了一个 int 类型的变量 x,并且通过 p 指针指向它。当我们调用 changeValue 并传入指向 p 的指针时,函数内部通过 **ptr 成功地修改了 x 的值。

何时使用指针之指针

指针之指针通常在以下情况下使用:

  1. 动态数组或二维数组:使用指针之指针来指向动态分配的数组。
  2. 函数修改多个返回值:通过指针之指针能够让函数修改超过一个值。
  3. 链表等复杂数据结构:在处理链表时,指针之指针可以用于修改链表的头指针。

动态数组的示例

以下是一个使用指针之指针的示例,创建动态二维数组:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include <stdio.h>
#include <stdlib.h>

void allocateMatrix(int ***matrix, int rows, int cols) {
*matrix = (int **)malloc(rows * sizeof(int *)); // 给指针数组分配内存
for (int i = 0; i < rows; i++) {
(*matrix)[i] = (int *)malloc(cols * sizeof(int)); // 每行分配内存
}
}

void freeMatrix(int **matrix, int rows) {
for (int i = 0; i < rows; i++) {
free(matrix[i]); // 释放每行的内存
}
free(matrix); // 释放指针数组内存
}

int main() {
int **myMatrix;
int rows = 3, cols = 4;
allocateMatrix(&myMatrix, rows, cols); // 传入指向指向指针的指针

// 填充并打印矩阵
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
myMatrix[i][j] = i + j; // 示例填充
printf("%d ", myMatrix[i][j]);
}
printf("\n");
}

// 释放内存
freeMatrix(myMatrix, rows);

return 0;
}

在上述代码中,allocateMatrix 函数通过指针之指针分配了一个二维数组的内存。通过这种方式,我们可以动态地管理内存,并实现更复杂的数据结构。

总结

指针之指针在 C 语言中是一个强大的工具,可以通过它与函数交互,实现更复杂的逻辑和数据结构。在实际开发中,理解并正确使用指针之指针将极大地丰富你的编程能力。

在下一篇中,我们将讨论结构体与共用体,特别是结构体的定义与使用,这将进一步扩展我们在 C 语言的数据结构知识。

28 指针之指针与函数

https://zglg.work/cplusplus-zero/28/

作者

IT教程网(郭震)

发布于

2024-08-10

更新于

2024-08-10

许可协议

分享转发

交流

更多教程加公众号

更多教程加公众号

加入星球获取PDF

加入星球获取PDF

打卡评论