C语言指针数组的用法(图文并茂,非常详细)
在 C语言中,指针数组是一个数组,它的每个元素都是指针。指针数组可以存储多个指针,并按照数组的方式进行索引和访问。
例如,定义一个整型指针数组,可以使用以下语法。
对于初始化指针数组也是如此,我们可以在定义指针数组时对其进行初始化。例如,定义并初始化一个指向整数的指针数组:
与访问其他类型的数组一样,我们可以使用下标操作符
下图更为直观地展示了上述内容:

图 1 pToArr 的指向
定义和赋值完数组后,我们使用这个指针数组来访问所有元素:
首先,pToArr 是一个元素类型为

图 2 p 的指向
查看图 2,
接着,我们分析表达式

图 3 p 指向 pToArr 的第一个元素

图 4 *p 指向 arr1 的第一个元素
表达式

图 5 指向 arr1 中各个元素
最后,表达式

图 6 arr1 数组内各个元素的值
我们再来顺一遍整个流程,如图下所示:
这样即可完成对 arr1 的访问。随着循环的继续,i 会变为 1 和 2。p 会指向 pToArr 中的第二和第三个元素,按照上面的处理,会继续访问 arr2、arr3 中的元素。通过这种方式,我们可以使用指针数组方便地访问多个数组。
C语言指针数组的定义
指针数组的定义类似于其他数组的定义,但数组的元素类型是指针类型。例如,定义一个整型指针数组,可以使用以下语法。
int *array[10];这里,array 是一个包含 10 个整型指针的数组。
对于初始化指针数组也是如此,我们可以在定义指针数组时对其进行初始化。例如,定义并初始化一个指向整数的指针数组:
int a = 1, b = 2, c = 3; int *array[] = {&a, &b, &c};这里,array 是一个整型指针数组,包含了三个指针,分别指向变量 a、b 和 c。
与访问其他类型的数组一样,我们可以使用下标操作符
[ ]
访问指针数组中的元素。例如,访问上面定义的整型指针数组 array 中的元素:
int x = *array[0]; // x 的值为 1 int y = *array[1]; // y 的值为 2 int z = *array[2]; // z 的值为 3这里,我们使用下标操作符
[ ]
访问指针数组中的指针,并使用 *
运算符获取指针所指向的值。C语言指针数组的使用
我们从普通的元素为 int 类型的数组开始,arr1、arr2 和 arr3 均为元素类型为 int 的数组。int arr1[5] = {1, 2, 3, 4, 5}; int arr2[5] = {11, 22, 33, 44, 55}; int arr3[5] = {111, 222, 333, 444, 555};我们知道,当数组名出现在表达式中时,它被转换为指向首元素的指针,即int *类型。现在,我们可以使用指针数组的知识将这几个数组的首元素指针存储到指针数组中:
int *pToArr[3]; pToArr[0] = arr1; pToArr[1] = arr2; pToArr[2] = arr3;在上述代码中,我们定义了一个整型指针数组 pToArr,它包含了 3 个整型指针。然后,我们将 arr1、arr2 和 arr3 的地址分别赋给了 pToArr 中的指针。其中:
- pToArr[0] 的类型为 int*,指向 arr1 的第 1 个元素;
- pToArr[1] 的类型为 int*,指向 arr2 的第 1 个元素;
- pToArr[2] 的类型为 int*,指向 arr3 的第 1 个元素。
下图更为直观地展示了上述内容:

图 1 pToArr 的指向
定义和赋值完数组后,我们使用这个指针数组来访问所有元素:
for(int i = 0; i < 3; i++) { int **p = pTOArr + i; for(int j = 0; j < 5; j++) { printf("%d ", *(*p + j)); } printf("\n"); }运行结果为:
1 2 3 4 5
11 22 33 44 55
111 222 333 444 555
首先,pToArr 是一个元素类型为
int*
的指针数组,数组大小为 3。我们知道,数组若出现在表达式中将会被转换为指向首元素的指针。因此,在 p = pToArr + i
中,pToArr 被转换为指向首元素的指针,即 int *[3]
被转换为 int **
,并且会指向 pToArr 数组中第 i 个元素的地址。
图 2 p 的指向
查看图 2,
pToArr + 0
类型为 int**
,指向 pToArr 的第一个元素;pToArr + 1
类型为 int**
,指向 pToArr 的第二个元素;pToArr + 2
类型为 int**
,指向 pToArr 的第三个元素。接着,我们分析表达式
*(*p + j)
。假设在 int **p = pToArr + i
中,i 的值为 0,那么 p 指向 pToArr 的第一个元素,如下图所示。
图 3 p 指向 pToArr 的第一个元素
*p
表达式结果为 pToArr[0]
,指向 arr1 的第一个元素,如下图所示。
图 4 *p 指向 arr1 的第一个元素
表达式
*p + j
,分别指向 arr1 中各个元素,如下图所示。
图 5 指向 arr1 中各个元素
最后,表达式
*(*p + j)
取得 arr1 数组内各个元素的值,如下图所示。
图 6 arr1 数组内各个元素的值
我们再来顺一遍整个流程,如图下所示:

- p 指向 pToArr 的第一个元素,类型为 int **。
- *p 指向 arr1 的第一个元素,类型为 int *。
- *p + j 指向 arr1 中的第 j 个元素,类型为 int *。
- *(*p + j) 为 arr1 中的第 j 个元素。
这样即可完成对 arr1 的访问。随着循环的继续,i 会变为 1 和 2。p 会指向 pToArr 中的第二和第三个元素,按照上面的处理,会继续访问 arr2、arr3 中的元素。通过这种方式,我们可以使用指针数组方便地访问多个数组。