指针与多维数组在C语言中

你好啊,未来的编程巨星们!? 我很激动能成为你们在这个激动人心的旅程中的向导,一起探索C语言中的指针和多维数组世界。作为教编程多年的我,我可以向你保证,虽然这些概念一开始可能看起来有点复杂,但一旦你掌握了它们,就会发现它们其实非常迷人。那么,让我们开始吧!

C - Pointers vs. Multi-dimensional Arrays

指针与一维数组

在我们深入多维数组之前,让我们从基础开始:指针和一维数组。这两个概念在C语言中紧密相关,理解它们之间的关系至关重要。

什么是指针?

指针是一个存储另一个变量内存地址的变量。可以把它想象成一个指向你计算机内存中某些数据存储位置的指示牌。下面是如何声明和使用指针的例子:

int number = 42;
int *ptr = &number;

printf("number的值: %d\n", number);
printf("number的地址: %p\n", (void*)&number);
printf("ptr的值: %p\n", (void*)ptr);
printf("ptr指向的值: %d\n", *ptr);

在这个例子中,ptr 是一个指针,它持有 number 的地址。& 操作符给我们一个变量的地址,而 * 操作符(当与指针一起使用时)给我们那个地址的值。

数组与指针

现在,让我们来看看有趣的地方。在C语言中,数组名实际上是指向其第一个元素的指针!让我们实际看看:

int arr[5] = {10, 20, 30, 40, 50};
int *p = arr;  // 不需要 &, arr 已经是一个指针!

printf("使用数组表示法的第一个元素: %d\n", arr[0]);
printf("使用指针表示法的第一个元素: %d\n", *p);

// 我们可以使用指针算术来访问其他元素
printf("使用指针算术的第三个元素: %d\n", *(p + 2));

这酷不酷?我们可以像使用指针一样使用 arr,因为从某种意义上说,它就是!

指针与二维数组

现在我们已经掌握了基础知识,让我们升级到二维数组。这些就像表格或网格,有行和列。

声明一个2D数组

下面是如何声明和初始化一个2D数组的例子:

int matrix[3][4] = {
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}
};

这创建了一个3x4的整数网格。但这与指针有什么关系呢?

2D数组与指针

一个2D数组本质上是一个指针数组,其中每个指针指向一个1D数组。让我们分解一下:

int (*p)[4] = matrix;

printf("第一个元素: %d\n", matrix[0][0]);
printf("使用指针的相同元素: %d\n", **p);

// 访问其他元素
printf("位于第1行第2列的元素: %d\n", matrix[1][2]);
printf("使用指针的相同元素: %d\n", *(*(p + 1) + 2));

在这个例子中,p 是一个指向4个整数数组的指针。每个 p + i 给我们一个指向行的指针,然后我们可以在该行内访问单个元素。

指针与三维数组

准备好迎接最终的大boss了吗?三维数组!这些就像堆叠的2D数组。想象一个由数字构成的立方体。

声明一个3D数组

下面是如何声明和初始化一个3D数组的例子:

int cube[2][3][4] = {
{{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}},
{{13, 14, 15, 16}, {17, 18, 19, 20}, {21, 22, 23, 24}}
};

这创建了一个2x3x4的整数立方体。

3D数组与指针

就像2D数组一样,我们可以使用指针来导航我们的3D数组:

int (*p)[3][4] = cube;

printf("第一个元素: %d\n", cube[0][0][0]);
printf("使用指针的相同元素: %d\n", ***p);

// 访问其他元素
printf("在第1层、第2行、第3列的元素: %d\n", cube[1][2][3]);
printf("使用指针的相同元素: %d\n", *(*(*(p + 1) + 2) + 3));

在这里,p 是一个指向3x4整数数组的指针。每一层 * 解引用都会降低一维数组的维度。

结论

哇!我们已经覆盖了很多内容,从简单的指针到复杂的三维数组。记住,掌握这些概念的关键是练习。尝试编写自己的代码,尝试不同的数组大小,不要害怕犯错误 - 这就是我们的学习方式!

以下是我们在本文中讨论的指针表示法的快速参考表:

数组类型 声明 指针表示法
一维数组 int arr[5] int *p = arr
二维数组 int arr[3][4] int (*p)[4] = arr
三维数组 int arr[2][3][4] int (*p)[3][4] = arr

继续编程,继续探索,记住 - 每个专家都曾是一个初学者。你可以的!??️

Credits: Image by storyset