一維數組:
假如有一維數組如下:
char a[3];
該數組有3個元素,數據類型為char型,地址空間如下。

如果想訪問數據,直接使用a[0]、a[1]、a[2]取出相應地址空間的值即可
一級指針:
指針即地址,char *b即定義一個指向char型數據的指針,int *b即定義一個指向int型數據的指針。
int a=5; int *b=&a;
例子解析:定義一個int型數據a,值為5,定義一個指向int型的指針b,b的值為a的地址。使用*b就是b指向地址的值。地址空間如下。

二級指針:
二級指針即指向指針的指針,
int a=5; int *b=&a; int **c=&b;
例子解析:定義一個int型數據a,值為5,定義一個指向int型的指針b,b的值為a的地址。使用*b就是b指向地址的值。定義一個指向指針的指針c,c的值為b的地址,*c就是b的值,也就是a的地址,**c就是a的值,地址空間如下。

一維數組與指針:
數組其實就是一段連續空間的數據,指針可以隨意指向某個地址,再讀取該地址的值。
int a[3]; int *b=a; int *c=&a; //錯誤
int (*c)[3]=&a; //正確 int *d=&a[0]; int *e=&a[1]; int *f=&a[2];
例子解析:
1. 定義一維數組a[3],在例子中,a、&a、&a[0]的值雖然都是一樣,但是意義不一樣。a代表a[3]這個數組,也是a[3]的起始地址。&a就是取a[3]的起始地址。&a[0]就是取數組第一個元素的地址。
2. 例子中,使用int *c=&a是錯誤的,因為a的數據類型是int (*)[3],而不是int *,所以必須以int (*c)[3]=&a。
3. 定義了int (*c)[3]=&a,可以使用(*c)[0]取得a[0],(*c)[1]取得a[1],(*c)[2]取得a[2]。

