1. int (*p)[10]
含义:
p
是一个 指向数组的指针,该数组包含 10 个int
类型的元素。- 这种声明方式中的
(*p)[10]
是一个数组类型,表示一个包含 10 个整数的数组。
结构解析:
*p
表示p
指向的内容是一个数组。(*p)[10]
表示p
指向的是一个包含 10 个整数的数组,数组的类型是int[10]
。
使用场景:
- 你通过
p
来访问数组,而不是访问数组的单个元素。 p
是一个指向数组的指针,因此我们可以通过(*p)[i]
来访问数组中的元素。
示例代码:
#include <stdio.h>
int main() {
int arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; // 声明一个数组
int (*p)[10] = &arr; // p 是一个指向包含 10 个 int 的数组的指针
// 访问数组中的元素
printf("p[0] = %d\n", (*p)[0]); // 访问 arr[0],输出 1
printf("(*p)[9] = %d\n", (*p)[9]); // 访问 arr[9],输出 10
return 0;
}
(*p)[0]
:首先通过p
访问整个数组,然后使用下标0
获取数组的第一个元素。
2. int *p[10]
含义:
p
是一个 数组,包含 10 个 指向int
类型的指针。p[10]
是一个包含 10 个元素的数组,每个元素都是int*
(即指向int
的指针)。
结构解析:
p[10]
是一个数组,包含 10 个元素。- 每个元素
p[i]
都是一个指针,指向一个int
类型的变量。
使用场景:
- 你通过
p[i]
来访问数组中的指针,然后使用*p[i]
来访问int
类型的数据。 p
本身并不是一个指向数组的指针,而是一个数组,数组中的每个元素都是指向int
的指针。
示例代码:
#include <stdio.h>
int main() {
int a = 5, b = 10, c = 15;
int *p[10]; // p 是一个数组,包含 10 个 int 指针
p[0] = &a; // p[0] 指向 a
p[1] = &b; // p[1] 指向 b
p[2] = &c; // p[2] 指向 c
// 通过指针访问数据
printf("p[0] = %d\n", *p[0]); // 输出 a 的值,5
printf("p[1] = %d\n", *p[1]); // 输出 b 的值,10
printf("p[2] = %d\n", *p[2]); // 输出 c 的值,15
return 0;
}
*p[0]
:p[0]
是指向a
的指针,通过解引用*p[0]
来获取a
的值。
区别总结:
1. 类型上的区别:
-
int (*p)[10]
:p
是一个指针,指向一个包含 10 个整数的数组,类型为int[10]
。*p
是一个数组,数组包含 10 个int
元素。
-
int *p[10]
:p
是一个数组,数组有 10 个元素,每个元素是一个指向int
的指针,即类型为int*
。p[i]
是指向int
的指针,可以通过*p[i]
来访问指针所指向的整数。
2. 使用方式上的区别:
int (*p)[10]
:p
是一个指向数组的指针,访问方式是通过(*p)[i]
来访问数组中的元素。- 主要用于操作一个大的数组(包含多个元素的数组)。
int *p[10]
:p
是一个数组,包含多个指针。每个元素是一个指向int
的指针,访问方式是通过p[i]
获取指针,再通过*p[i]
解引用来访问数据。- 主要用于处理多个
int
类型变量的指针数组。
3. 内存结构上的区别:
int (*p)[10]
:p
指向一个数组,因此只有一个指针,指向的是整个数组。- 内存上,它只占用一个指针的空间(通常是 4 或 8 字节),指向一个数组。
int *p[10]
:p
是一个数组,数组的每个元素是一个指针,因此总共需要 10 个指针变量的空间。- 内存上,它占用的是 10 个指针的空间(通常是 40 或 80 字节,具体取决于指针大小)。
总结:
int (*p)[10]
:p
是一个指向数组的指针,指向一个包含 10 个int
元素的数组。int *p[10]
:p
是一个数组,包含 10 个指向int
的指针。
这两种声明方式的用途和内存结构有很大区别,取决于你需要处理的数据类型和结构。