30 指针之指针与数组

在上一篇中,我们讨论了指针之指针的基本概念。今天,我们将深入探讨指针之指针在数组中的应用。此篇文章旨在帮助你更清晰地理解这一概念,并为下一篇讨论指针之指针作为函数参数打下基础。

指针之指针的复习

首先,回顾一下指针之指针(即double pointer)的概念。它是一个指向指针的指针,通常用**表示。例如:

1
2
3
int a = 10;
int *p = &a; // p是一个指向整数的指针
int **pp = &p; // pp是一个指向指针p的指针

在这个例子中,pp存储了指针p的地址,因此我们可以通过**pp来获取变量a的值。

指针之指针与数组

数组的本质

在C语言中,数组的名字在大多数上下文中代表该数组的首元素的地址。例如,一个整型数组int arr[3] = {1, 2, 3};可以通过指针表达如下:

1
int *p = arr; // p是指向数组首元素的指针

指针数组的概念

有时,我们可能需要一个数组的每个元素都是一个指针,称为指针数组。例如:

1
char *names[3] = {"Alice", "Bob", "Charlie"};

在这个示例中,names是一个指向字符型指针的数组,每个元素指向一个字符串。

指针之指针与二维数组

当我们使用指针之指针时,通常与二维数组有密切关系。例如,定义一个动态分配的二维数组,我们将使用指向指针的指针:

1
2
3
4
5
6
7
int rows = 3;
int cols = 4;
int **array = malloc(rows * sizeof(int*)); // 动态分配行指针

for (int i = 0; i < rows; i++) {
array[i] = malloc(cols * sizeof(int)); // 每行分配列元素
}

在上述代码中,array是一个指向指针的指针,指向每一行的指针。接下来我们可以填充这个二维数组:

1
2
3
4
5
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
array[i][j] = i * cols + j; // 填充数组
}
}

访问二维数组

我们可以通过指针之指针的方式来访问和输出二维数组的内容:

1
2
3
4
5
6
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
printf("%d ", array[i][j]); // 访问元素
}
printf("\n");
}

释放内存

由于我们使用了动态内存分配,因此最后还需要释放内存,以防内存泄漏:

1
2
3
4
for (int i = 0; i < rows; i++) {
free(array[i]); // 释放每一行的内存
}
free(array); // 释放行指针的内存

总结

在本节中,我们探讨了指针之指针与数组的关系,尤其是如何使用指针之指针来处理动态二维数组。关键点在于理解指针与数组之间的相互关系,以及如何通过指针之指针有效地管理内存。

在下一篇文章中,我们将讨论指针之指针作为函数参数的用法,这将进一步拓宽你的C语言编程技能。希望你能将今天的知识与实践结合起来,深入掌握这一重要的概念。

30 指针之指针与数组

https://zglg.work/c-language-zero/30/

作者

IT教程网(郭震)

发布于

2024-08-10

更新于

2024-08-10

许可协议

分享转发

交流

更多教程加公众号

更多教程加公众号

加入星球获取PDF

加入星球获取PDF

打卡评论