對指標陣列和陣列指標的概念,相信很多c程式設計師都會混淆。下面通過兩個簡單的語句來分析一下二者之間的區別,示例**如下所示:
int
*p1[5];
int(
*p2)[5
];
首先,對於語句「intp1[5]」,因為「」的優先順序要比「」要高,所以 p1 先與「」結合,構成乙個陣列的定義,陣列名為 p1,而「int*」修飾的是陣列的內容,即陣列的每個元素。也就是說,該陣列包含 5 個指向 int 型別資料的指標,因此,它是乙個指標陣列。
其次,對於語句「int(p2)[5]」,「()」的優先順序比「」高,「」號和 p2 構成乙個指標的定義,指標變數名為 p2,而 int 修飾的是陣列的內容,即陣列的每個元素。也就是說,p2 是乙個指標,它指向乙個包含 5 個 int 型別資料的陣列。很顯然,它是乙個陣列指標,陣列在這裡並沒有名字,是個匿名陣列。
由此可見,對指標陣列來說,首先它是乙個陣列,陣列的元素都是指標,也就是說該陣列儲存的是指標,陣列佔多少個位元組由陣列本身決定;而對陣列指標來說,首先它是乙個指標,它指向乙個陣列,也就是說它是指向陣列的指標,在 32 位系統下永遠佔 4 位元組,至於它指向的陣列佔多少位元組,這個不能夠確定,要看具體情況。
了解指標陣列和陣列指標二者之間的區別之後,繼續來看下面的示例**:
int arr[5]
=;int(
*p1)[5
]=&arr;
/下面是錯誤的/
int
(*p2)[5
]= arr;
不難看出,在上面的示例**中,&arr 是指整個陣列的首位址,而 arr 是指數組首元素的首位址,雖然所表示的意義不同,但二者之間的值卻是相同的。那麼問題出來了,既然值是相同的,為什麼語句「int(p1)[5]=&arr」是正確的,而語句「int(p2)[5]=arr」卻在有些編譯器下執行時會提示錯誤資訊呢(如在 microsoft visual studio 2010 中提示的錯誤資訊為「a value of type"int"cannot be used to initialize an entity of type"int()[5]"」)?
其實原因很簡單,在 c 語言中,賦值符號「=」號兩邊的資料型別必須是相同的,如果不同,則需要顯示或隱式型別轉換。在這裡,p1 和 p2 都是陣列指標,指向的是整個陣列。p1 這個定義的「=」號兩邊的資料型別完全一致,而 p2 這個定義的「=」號兩邊的資料型別就不一致了(左邊的型別是指向整個陣列的指標,而右邊的資料型別是指向單個字元的指標),因此會提示錯誤資訊。
C語言 陣列指標和指標陣列的用法 區別
2.指標陣列 陣列指標和指標陣列,從字面上區分的方法就是 本質看最後兩個字。例如陣列指標的本質就是乙個指標,乙個指向陣列的指標 而指標陣列的本質就是乙個陣列,乙個成員都是指標的陣列。陣列指標,即指向乙個陣列的指標。可以指向一維陣列,也可以指向二維陣列 三維及以上陣列一般不用 int p n null...
C 陣列指標和指標陣列的區別
陣列指標 也稱行指標 定義 int p n 優先順序高,首先說明p是乙個指標,指向乙個整型的一維陣列,這個一維陣列的長度是n,也可以說是p的步長。也就是說執行p 1時,p要跨過n個整型資料的長度。如要將二維陣列賦給一指標,應這樣賦值 int a 3 4 int p 4 該語句是定義乙個陣列指標,指向...
C語言 陣列指標與指標陣列區別
陣列指標 也稱行指標 int p n 優先及高,首先說明p是乙個指標,指向乙個整型的一維陣列,這個一維陣列的長度是n,也可以說是p的步長。也就是說執行p 1時,p要跨過n個整型資料的長度。int a 3 2 int p 2 p a p 該語句執行後,也就是p p 1,p跨過a 0 指向了a 1 所以...