區別:指針數組本身是數組,數組的元素都是指針,即數組存儲的是指針,數組佔多少個字節由數組本身決定;而數組指針本身是一個指針,它指向一個數組,即它是指向數組的指針,在32位元系統下永遠佔4位元組。
本教學操作環境:windows7系統、c99版本、Dell G3電腦。
對指標數組和陣列指標的概念,相信很多C程式設計師都會混淆。下面透過兩個簡單的語句來分析二者之間的區別,範例程式碼如下所示:
int *p1[5]; int (*p2)[5];
首先,對於語句“int*p1[5]”,因為“[]”的優先級要比「*」高,所以p1 先與「[]」結合,構成一個數組的定義,數組名為p1,而「int*」修飾的是數組的內容,也就是數組的每個元素。也就是說,該數組包含 5 個指向 int 類型資料的指針,如圖 1 所示,因此,它是一個指針數組。
其次,對於語句“int(*p2)[5]”,“()”的優先權比“[]”高,“*”號碼和p2構成一個指標的定義,指標變數名為p2,而int 修飾的是陣列的內容,也就是陣列的每個元素。也就是說,p2 是一個指針,它指向一個包含 5 個 int 類型資料的數組,如圖 2 所示。很顯然,它是一個陣列指針,數組在這裡並沒有名字,是個匿名數組。
由此可見,對指針數組來說,首先它是一個數組,數組的元素都是指針,也就是說該數組存儲的是指針,數組佔多少個位元組由數組本身決定;而對數組指針來說,首先它是一個指針,它指向一個數組,也就是說它是指向數組的指針,在32 位元系統下永遠佔4 字節,至於它指向的數組佔多少字節,這個不能夠確定,要看具體情況。
了解指標陣列和陣列指標二者之間的差異之後,繼續來看下面的範例程式碼:
int arr[5]={1,2,3,4,5}; int (*p1)[5] = &arr; /*下面是错误的*/ int (*p2)[5] = arr;
不難看出,在上面的範例程式碼中,&arr 是指整個陣列的首位址,而arr 是指數組首元素的首位址,雖然所表示的意義不同,但二者之間的值卻是相同的。那麼問題出來了,既然值是相同的,為什麼語句「int(*p1)[5]=&arr」是正確的,而語句「int(*p2)[5]=arr」卻在有些編譯器下執行時會提示錯誤訊息呢。
其實原因很簡單,在 C 語言中,賦值符號「=」號兩邊的資料型別必須是相同的,如果不同,則需要顯示或隱式型別轉換。在這裡,p1 和 p2 都是數組指針,指向的是整個數組。 p1 這個定義的「=」號兩邊的資料型別完全一致,而p2 這個定義的「=」號兩邊的資料型別就不一致了(左邊的型別是指向整個陣列的指針,而右邊的資料型別是指向單一字元的指標),因此會提示錯誤訊息。
相關推薦:《C語言影片教學》
以上是數組指標和指標數組的差異是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!