指针数组和数组指针是 C 语言中比较常见的两种类型。它们虽然名字很相似,但是含义、用法以及指向类型都不同,需要分开理解。
指针数组
指针数组是一个数组,其中每个元素都是一个指针。这些指针可以指向不同类型的数据,也可以指向相同类型的数据。例如,下面是一个包含 3 个指针的指针数组,其中每个指针指向一个整数:
int a = 1, b = 2, c = 3;
int* ptr_array[3] = {&a, &b, &c};
上面这个指针数组 ptr_array 包含 3 个元素,每个元素都是一个指向整数的指针。这些指针分别指向变量 a、b 和 c 的地址。我们可以通过下标访问这些指针,进而访问到相应的整数:
printf("%d %d %d\n", *(ptr_array[0]), *(ptr_array[1]), *(ptr_array[2]));
上面这行代码输出 1、2 和 3,分别对应变量 a、b 和 c 的值。
需要注意的是,指针数组中的每个元素都是一个指针,因此当我们想要使用指针数组的元素时,需要通过解引用运算符 * 来获取它所指向的值,例如上面的 *(ptr_array[0])。
数组指针
数组指针是一个指针,它指向一个数组。它也可以指向不同类型的数组,例如整数数组、字符数组等。我们可以使用数组下标运算符 [] 来访问指针所指向的数组中的元素。例如,下面是一个指向 3 个整数的数组的指针:
int array[3] = {1, 2, 3};
int (*ptr_array)[3] = &array;
上述代码中,ptr_array 是一个指向 3 个整数的数组的指针。我们可以通过下标访问数组中的元素:
printf("%d %d %d\n", (*ptr_array)[0], (*ptr_array)[1], (*ptr_array)[2]);
上述代码会输出 1、2 和 3,分别对应数组中的元素。
需要注意的是,由于数组指针指向的是一个数组,因此当我们想要使用数组指针所指向的数组时,需要使用括号将指针和下标括起来,例如上面的 (*ptr_array)[0]。
下面是一个完整的示例代码,演示了指针数组和数组指针的使用:
#include <stdio.h>
int main() {
// 指针数组
int a = 1, b = 2, c = 3;
int* ptr_array[3] = {&a, &b, &c};
printf("%d %d %d\n", *(ptr_array[0]), *(ptr_array[1]), *(ptr_array[2]));
// 数组指针
int array[3] = {1, 2, 3};
int (*ptr_array2)[3] = &array;
printf("%d %d %d\n", (*ptr_array2)[0], (*ptr_array2)[1], (*ptr_array2)[2]);
return 0;
}