# 指針數組
根據[數組的定義](https://mengkang.net/1008.html):同一類型多個元素的集合,所以數組也能存放指針集合。
```c
#include <stdio.h>
int main(int argc, char const *argv[]) {
int a = 1;
int b = 2;
int *p[2] = {&a, &b};
printf("a : %p,%d\n", &a, *(&a));
printf("*(p + 0) : %p,%d\n", *(p + 0), *(*(p + 0)));
printf("b : %p,%d\n", &b, *(&b));
printf("*(p + 1) : %p,%d\n", *(p + 1), *(*(p + 1)));
return 0;
}
```
輸出結果
```
a : 0x7fff55e0ca7c,1
*(p + 0) : 0x7fff55e0ca7c,1
b : 0x7fff55e0ca78,2
*(p + 1) : 0x7fff55e0ca78,2
```
上例子,`p`表示數組,`int *`表示該數組存放的`int`類型的指針。依然數組指針偏移1位,是下一個成員的值。這一點和原來規則一致 https://mengkang.net/1009.html#blog-title-3 不變。
# 數組指針
## 指向二維數組的指針
數組指針,指的是數組名的指針,即數組首元素地址的指針。(因為數組名就代表數組的首地址)
上面的例子關于`int *p[2]`的定義也可以寫成`int* p[2]`,或者`int * p[2]`,但是不能寫成`int (*p)[2]`。
因為在語法分析的時候`*`符號是和左邊的數據類型結合的,不管中間有多少空格。而使用`()`之后,則使得`p`變成一個數組指針。
```c
#include <stdio.h>
int main(int argc, char const *argv[]) {
int arr[2][2] = {{1,2},{3,4}};
int (*p)[2] = arr; // p是一個指針變量,它指向一個數組,而這個數組的每個成員又是一個含有2個int的數組
printf("%d\n", *(*(p+0)+0));//1
printf("%d\n", **p);//1
printf("%d\n", *(*(p+1)+1));//4
return 0;
}
```
這就是
```c
int *p[2]
int (*p)[2]
```
的區別
## 指向一維數組的指針
前面為了對比,先說了指向二維數組的指針,顯得非常繞。一維數組的指針呢,就非常簡單了。
```c
#include <stdio.h>
int main(int argc, char const *argv[]) {
int a[5], *pa;
for (int i = 0; i < 5; i++) {
a[i] = i;
}
pa = a;
for (int i = 0; i < 5; i++) {
printf("a[%d]=%d\n", i, *pa);
pa++;
}
}
```