C/C++:指针数组与数组指针
指针数组和数组指针是两个在 C/C++ 中常见但容易混淆的概念。它们的区别主要在于数据的类型和用途。
指针数组 (Array of Pointers)
指针数组是一个数组,数组的每个元素都是指针。简单来说,它是存放指针的数组。数组中的每个指针可以指向不同的变量或数据。
声明形式:
int *arr[5]; // 一个长度为 5 的指针数组,每个元素都是指向 int 类型的指针
解释:
arr
是一个数组,其中的每个元素都是一个 int
类型的指针(即 int*
)。它们可以分别指向不同的 int
变量。
int a = 1, b = 2, c = 3;
int *arr[3]; // 一个长度为 3 的指针数组
arr[0] = &a; // arr[0] 指向 a 的地址
arr[1] = &b; // arr[1] 指向 b 的地址
arr[2] = &c; // arr[2] 指向 c 的地址
printf("%d\n", *arr[0]); // 输出 1
printf("%d\n", *arr[1]); // 输出 2
printf("%d\n", *arr[2]); // 输出 3
最后代码的执行结果:
数组指针 (Pointer to an Array)
数组指针是一个指针,它指向一个数组。简单来说,它是一个指向数组的指针。
声明形式:
int (*p)[5]; // 一个指向包含 5 个 int 类型元素的数组的指针
解释:
p
是一个指针,它指向一个包含 5 个 int
类型元素的数组。注意,p
不是指向单个 int
类型的指针,而是指向整个数组。
int arr[5] = {1, 2, 3, 4, 5};
int (*p)[5] = &arr; // p 指向整个数组 arr
// 访问数组中的元素
printf("%d\n", (*p)[0]); // 输出 1
printf("%d\n", (*p)[1]); // 输出 2
printf("%d\n", (*p)[2]); // 输出 3
代码执行结果:
这里的 (*p)
表示对指针 p
解引用,这相当于“取出”指针 p
所指向的整个数组(即 arr
)。因此,(*p)[0]
等价于 arr[0]
。输出结果为 1
。
为什么需要解引用 (*p)
?
1.p是一个指向数组的指针,它本身并不直接表示数组,而是一个指向数组的地址。 2.当我们使用 (*p) 进行解引用时,(*p) 的类型就变成了int[5],即一个包含 5 个整数的数组。 3.使用 (*p)[0]、(*p)[1]、(*p)[2]等表示的就是数组中的元素。
总结
-
指针数组:数组中的每个元素都是指针。例子:
int *arr[5]
,表示一个数组,数组内有 5 个指针,每个指针指向int
类型的数据。 -
数组指针:一个指向数组的指针。例子:
int (*p)[5]
,表示一个指向含有 5 个int
类型元素的数组的指针。
原文地址:https://blog.csdn.net/WolvenSec/article/details/143183592
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!