printf 指標位址 陣列指標和指標陣列

2021-10-11 19:24:43 字數 2908 閱讀 3777

首先,理解一下陣列指標和指標陣列這兩個名詞:

陣列的指標:是乙個指標,什麼樣的指標呢?指向陣列的指標。

指標的陣列:是乙個陣列,什麼樣的陣列呢?裝著指標的陣列。

然後,需要明確乙個優先順序順序:()>>*,所以:

(*p)[n]:根據優先順序,先看括號內,則p是乙個指標,這個指標指向乙個一維陣列,陣列長度為n,這是「陣列的指標」,即陣列指標;

*p[n]:根據優先順序,先看,則p是乙個陣列,再結合*,這個陣列的元素是指標型別,共n個元素,這是「指標的陣列」,即指標陣列。

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 main()

; //步長為5的陣列指標,即陣列裡有5個元素

int (*p)[5];

//把陣列a的位址賦給p,則p為陣列a的位址,則*p表示陣列a本身

p = &a;

//%p輸出位址, %d輸出十進位制

//n回車

//在c中,在幾乎所有使用陣列的表示式中,陣列名的值是個指標常量,也就是陣列第乙個元素的位址,它的型別取決於陣列元素的型別。

printf("%pn", a); //輸出陣列名,一般用陣列的首元素位址來標識乙個陣列,則輸出陣列首元素位址

printf("%pn", p); //根據上面,p為陣列a的位址,輸出陣列a的位址

printf("%pn", *p); //*p表示陣列a本身,一般用陣列的首元素位址來標識乙個陣列

printf("%pn", &a[0]); //a[0]的位址

printf("%pn", &a[1]); //a[1]的位址

printf("%pn", p[0]); //陣列首元素的位址

printf("%dn", **p); //*p為陣列a本身,即為陣列a首元素位址,則*(*p)為值,當*p為陣列首元素位址時,**p表示首元素的值1

printf("%dn", *p[0]); //根據優先順序,p[0] 表示首元素位址,則*p[0]表示首元素本身,即首元素的值1

printf("%dn", *p[1]); //為乙個絕對值很大的負數,不表示a[1]...表示什麼我還不知道

//將二維陣列賦給指標

int b[3][4];

int(*pp)[4]; //定義乙個陣列指標,指向含4個元素的一維陣列

pp = b; //將該二維陣列的首位址賦給pp,也就是b[0]或&b[0],二維陣列中pp=b和pp=&b[0]是等價的

pp++; //pp=pp+1,該語句執行過後pp的指向從行b[0]變為了行b[1],pp=&b[1]

int k;

scanf_s("%d", &k);

return 0;

}

根據上面二維陣列可以得出,陣列指標也稱指向一維陣列的指標,所以陣列指標也稱行指標。

指標陣列:是陣列——裝著指標的陣列。

看下面的例子進行理解:

int main()

最後,從上文來看:

陣列指標是乙個指標變數,占有記憶體中乙個指標的儲存空間;

指標陣列是多個指標變數,以陣列的形式儲存在記憶體中,占有多個指標的儲存空間。

了解指標陣列和陣列指標二者之間的區別之後,繼續來看下面的示例**:

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 這個定義的「=」號兩邊的資料型別就不一致了(左邊的型別是指向整個陣列的指標,而右邊的資料型別是指向單個字元的指標),因此會提示錯誤資訊。

指標 陣列 位址

指標跟位址概念的不同,指標是一種位址變數,通常也叫指標變數,統稱指標。而位址則是位址變數的值。實際上,位址這個東西,本來就是一種基本資料型別,本應該在介紹整數 浮點 字元等基本型別的時候把位址顯式地放在一起討論,這樣在後面介紹指標與陣列的時候就能避免許多誤解。可惜不少教材或者根本沒有談及,或者就算提...

陣列指標和指標陣列 函式指標和指標函式

一 陣列指標與指標陣列 1,指標陣列 所謂指標陣列,就是指標組成的陣列,即陣列的元素為指標 int pa size size為元素數目,元素的值為int型別的指標 2,陣列指標 所謂陣列指標,就是指向陣列的指標,即其是乙個指標,指向陣列。int pa size size為陣列的元素數目,pa指向乙個...

陣列指標和指標陣列

陣列指標 也稱行指標 定義 int p n 優先順序高,首先說明p是乙個指標,指向乙個整型的一維陣列,這個一維陣列的長度是n,也可以說是p的步長。也就是說執行p 1時,p要跨過n個整型資料的長度。如要將二維陣列賦給一指標,應這樣賦值 int a 3 4 int p 4 該語句是定義乙個陣列指標,指向...