在C语言中,“数组指针”和“指针数组”是两个不同的概念,尽管名字相似,但它们的用途和用法有明显的区别。下面我们详细解释一下这两个概念。
### 数组指针 (Pointer to an Array)
数组指针是指向一个数组的指针。它保存的是数组的地址。假设我们有一个数组:
```c
int arr[5] = {1, 2, 3, 4, 5};
```
定义一个指向这个数组的指针,我们可以这样做:
```c
int (*p)[5];
p = &arr;
```
在这里,`p`是一个指向包含5个整数的数组的指针。
- `*p` 是 `arr` 数组本身。
- `(*p)[i]` 是数组中的第 `i` 个元素。
例如,要访问数组的第一个元素,我们可以这样写:
```c
int firstElement = (*p)[0];
```
### 指针数组 (Array of Pointers)
指针数组是一个数组,其中每个元素都是一个指针。例如,我们可以有一个指针数组来存储多个字符串:
```c
char *arr[3];
arr[0] = "Hello";
arr[1] = "World";
arr[2] = "!";
```
在这里,`arr` 是一个包含三个指针的数组,每个指针指向一个字符串。
- `arr[i]` 是一个指向字符串的指针。
- `arr[i][j]` 是第 `i` 个字符串中的第 `j` 个字符。
例如,要访问第二个字符串的第一个字符,我们可以这样写:
```c
char firstCharOfSecondString = arr[1][0];
```
### 示例代码
以下是一个示例代码,展示了如何使用数组指针和指针数组:
```c
#include <stdio.h>
int main() {
// 数组指针示例
int arr[5] = {1, 2, 3, 4, 5};
int (*p)[5] = &arr; // 数组指针
printf("数组指针示例:\n");
for (int i = 0; i < 5; i++) {
printf("%d ", (*p)[i]);
}
printf("\n");
// 指针数组示例
char *strArr[3];
strArr[0] = "Hello";
strArr[1] = "World";
strArr[2] = "!";
printf("指针数组示例:\n");
for (int i = 0; i < 3; i++) {
printf("%s ", strArr[i]);
}
printf("\n");
return 0;
}
```
运行这段代码,将输出:
```
数组指针示例:
1 2 3 4 5
指针数组示例:
Hello World !
```
希望这个解释能够帮助你理解C语言中的数组指针和指针数组的区别和用法。