【数组指针和指针数组的区别】在C语言中,"数组指针"和"指针数组"是两个容易混淆的概念。虽然它们都涉及“数组”和“指针”,但它们的含义和用途完全不同。以下是对这两个概念的详细总结与对比。
一、基本定义
| 概念 | 定义 |
| 数组指针 | 是一个指针,指向一个数组。其本质是一个指针变量,存储的是数组的首地址。 |
| 指针数组 | 是一个数组,其中的每个元素都是指针。其本质是一个数组,存储的是多个指针。 |
二、语法结构
| 概念 | 语法示例 | 说明 |
| 数组指针 | `int (p)[10];` | `p` 是一个指向包含10个整型元素的数组的指针 |
| 指针数组 | `int p[10];` | `p` 是一个包含10个指针的数组,每个指针指向整型 |
三、使用场景
| 概念 | 使用场景 |
| 数组指针 | 当需要操作整个数组,或者传递数组到函数中时使用。通常用于多维数组的处理。 |
| 指针数组 | 当需要存储多个指针,如字符串数组、函数指针数组等时使用。 |
四、内存布局
| 概念 | 内存布局说明 |
| 数组指针 | 指针变量本身占用内存(通常是4或8字节),它指向的是一个连续的数组区域。 |
| 指针数组 | 数组中的每个元素都是一个指针,每个指针占用内存(通常是4或8字节)。 |
五、访问方式
| 概念 | 访问方式 |
| 数组指针 | 通过 `(p)[i]` 或 `p[i]` 来访问数组元素。 |
| 指针数组 | 通过 `p[i]` 来访问指针,再通过 `p[i]` 访问指针指向的数据。 |
六、举例说明
数组指针示例:
```c
int arr[5] = {1, 2, 3, 4, 5};
int (p)[5] = &arr;// p 是指向数组 arr 的指针
printf("%d\n", (p)[2]);// 输出 3
```
指针数组示例:
```c
char strs[3] = {"one", "two", "three"};
printf("%s\n", strs[0]);// 输出 "one"
```
七、总结
| 项目 | 数组指针 | 指针数组 |
| 类型 | 指针类型 | 数组类型 |
| 存储内容 | 数组的地址 | 指针的地址 |
| 用途 | 操作整个数组 | 存储多个指针 |
| 声明方式 | `数据类型 (指针名)[数组长度];` | `数据类型 指针名[数组长度];` |
| 访问方式 | `(p)[i]` 或 `p[i]` | `p[i]` 和 `p[i]` |
通过以上对比可以看出,“数组指针”和“指针数组”虽然名称相似,但它们的结构、用途和访问方式都有明显区别。理解这两者的不同有助于在实际编程中正确使用指针和数组,提高代码的可读性和效率。


