指針的類型和指針所指向的類型很明顯是不一樣的東西,但好多情況下卻容易忽視它們的區別。指針的類型是指針自身的類型,而指針所指向的類型是指針指向的數據(內存)的類型。
指針的類型
從語法上來看,我們只要把指針聲明語句里的指針名字去掉,剩下的部分就是這個指針的類型。如:
1 int *ptr; //指針的類型是 int* 2 char *ptr; //指針的類型是 char* 3 int **ptr; //指針的類型是 int** 4 int (*ptr)[3]; //指針的類型是 int(*)[3] 5 int *(*ptr)[4]; //指針的類型是 int*(*)[4]
指針所指向的類型
從語法上來看,我們只要把指針聲明語句中的指針名字和名字左邊的指針聲明符*去掉,剩下的就是指針所指向的類型。 如:
1 int *ptr; //指針所指向的類型是 int 2 char *ptr; //指針所指向的的類型是 char 3 int **ptr; //指針所指向的的類型是 int* 4 int (*ptr)[3]; //指針所指向的的類型是 int()[3] 5 int *(*ptr)[4]; //指針所指向的的類型是 int*()[4]
一些小案例
案例1
請看小程序:
1 int *p[3]; 2 for (int i = 0; i < 3; i++) 3 { 4 p[i] = i; 5 }
實際上這個小程序是有問題的。我們定義了一個指針數組,數組里的每個元素存儲的都是指針。所以p[i] = i相當於要將int強制轉換成int *類型,這當然不行(p[i] = (int *) i 就可以)。
可把程序修改如下:
1 int *p[3]; 2 for (int i = 0; i < 3; i++) 3 { 4 p[i] = new int(i); 5 }
案例2
請看小程序:
1 int (*p)[3]; 2 p = new int[][3]; 3 for (int i = 0; i < 3; i++) 4 { 5 (*p)[i] = i; 6 }
上邊程序的int (*p)[3]其實相當於int p[3](注意這時p就變成不可更改的左值了)。