指標陣列:首先它是乙個陣列,陣列的元素都是指標。它是「儲存指標的陣列」的簡稱。int *p1[10];
陣列指標:首先它是乙個指標,它指向乙個陣列。它是「指向陣列的指標」的簡稱。 int (*p2)[10];
這裡需要明白乙個符號之間的優先順序問題,關鍵在於p1、p2先和誰結合。
「」的優先順序比「*」要高。p1 先與「」結合,構成乙個陣列的定義,陣列名為 p1,int *修飾的是陣列的內容,即陣列的每個元素。那現在我們清楚,這是乙個陣列,其包含 10 個指向 int 型別資料的指標,即指標陣列。
至於 p2 就更好理解了,在這裡「()」的優先順序比「」高,「*」號和 p2 構成乙個指標的定義,指標變數名為 p2,int 修飾的是陣列的內容,即陣列的每個元素。陣列在這裡並沒有名字,是個匿名陣列。那現在我們清楚 p2 是乙個指標,它指向乙個包含 10 個 int 型別資料的陣列,即陣列指標。
我們可以借助下面的圖加深理解:
上述摘自:《c語言深度解剖》
關於指標陣列和陣列指標的**:
#include using namespace std;
int main()
; int b[2][3] = , };
p1[0] = &a[0];//int *
p1[1] = &a[1];//int *
p1[2] = a + 2;//int *
for (int i = 0; i < 3; i++)
cout << *p1[i] << " ";
//output:1 2 3
p2 = &a; //int (*)[3]
for (int i = 0; i < 3; i++)
cout << (*p2)[i] << " ";
//output:1 2 3
p2 = &b[1]; //int (*)[3]
for (int i = 0; i < 3; i++)
cout << (*p2)[i] << " ";
//output:4 5 6
}
明確兩點1. int a[3] = ;
a是陣列的首元素的首位址,具體地說是乙個具有3個整型變數的陣列的名字,而&a是整個陣列的首位址,其值相同但意義不同。
編譯器根據我們提供的型別和陣列大小,為我們分配了適當大小的儲存區域,並且把這塊儲存區域叫做a。請注意 :&a,它的型別是「指向具有 3 個整型變數陣列的指標「,簡而言之&a是乙個陣列指標。
2. &a+1
式子&a+1表示的是指標加法運算,而不是普通的數值加法運算,之所以會這樣是因為&a是乙個指標而非普通數值(雖然它本質上也是乙個整數)。假如此時&a=0xffff5700,那麼&a+1是多少呢?答案是:取決於&a的型別 。
a) 如果&a是乙個指向char型的指標,那麼&a+1 = 0xffff5701
b) 如果&a是乙個指向short型的指標,那麼&a+1 = 0xffff5702
c) 如果&a是乙個指向int型的指標,那麼&a+1 = 0xffff5704 (32位機器)
d) 如果&a是乙個指向某種結構體struct foo的指標,那麼&a+1 = 0xffff5700+sizeof(struct foo)
……指標加1不是指標內容簡單地加1,而是讓指標指向下乙個資料,這個資料的型別就是指標指向的型別,所以指標的加法究竟會讓這個指標指向**,取決於這個指標指向的資料型別。
因此,綜上所述,當&a與整數1做加法時,實際上是指標的加法,加1的含義是:令指標a指向下乙個資料 ,下乙個資料是啥?當然是緊挨著的下乙個具有3個整型變數的陣列了(因為&a的型別是指向具有3個整型變數的陣列的指標)。
指標陣列和陣列指標
有關陣列指標和指標陣列容易混淆,本文舉例說明兩者的區別,並加以分析。基本概念 指標 inta 1 int p a 指標的指標 int p2p p 簡單陣列 intb 20 指標陣列 int p 10 指標陣列,含有10個指標元素,即每乙個元素都是乙個指標 陣列指標 int p 10 這個指標用來指向...
指標陣列和陣列指標
理解這兩個概念,當從語言學的語法角度開始,定語 名詞,即 的 語句。指標陣列 指標的陣列 陣列指標 陣列的指標。一 指標陣列 元素為指標的陣列 顧名思義,就是說的首先是乙個陣列吧,然後陣列的元素是指標而已。說明形式為 type pointer array constant1 constant2 co...
指標陣列和陣列指標
該文時自己對指標陣列用法的一點總結,還望高手指點不足原文如下 由於以前對指標陣列不太明白,所以自己寫了 乙個小的測試程式來驗證了自己的猜測,先總結如下 指標陣列,由名字就可以知道的該陣列中的成員都是為指標的。其定義的方法為 char p 5 該初定義乙個包含5個char 型別的陣列的指標,由於p本身...