對陣列名取位址賦值給陣列指標與普通指標的區別

2021-08-29 16:30:09 字數 1647 閱讀 3363

以下紅色字型的說法是錯誤的:

使用一級指標來接受&arr,只是表示乙個普通的一級指標,

它並沒有接收到&arr賦來的跨度,而只接收到了位址而已。所以,

p1的跨度只有4個位元組。它儲存的位址所表示的是arr這個陣列的首元素位址

相當於在賦值過程中,&arr退化為了arr,失去了陣列本來擁有的跨度。

此時p1[i],就是在對陣列中的每乙個陣列元素做遍歷了。

同理,以下紅色字型的說法同樣不正確:

p2此時的位址已經為arr,*p2就是陣列元素的值了。

而二級指標的特點就是在於它儲存的是一級指標的位址,即它的內容就是一級指標的位址。

*p2就是這個一級指標的位址。

*(*p2)則為對元素的值取位址,因為陣列元素的值是手動賦值的,

那麼**p此時就是對野指標的非法操作了。

p為&arr首位址

*p為arr首元素位址

**p為陣列元素內容

綜上:一維陣列名對應一級指標,二維陣列名對應二級指標,n維陣列名對應n級指標。

#define _crt_secure_no_warnings

#include#includeint main(int argc, char *argv)

; /*一下的說法是錯誤的:

陣列指標才是將位址連同&arr這個位址的跨度一起賦給了指標變數;

而是用普通的一級指標來接受的&arr,只是表示乙個普通的一級指標,

它並沒有接收到&arr賦來的跨度,而只接收到了位址而已。所以,

p1的跨度只有4個位元組。它儲存的位址所表示的是arr這個陣列的首元素位址

相當於在賦值過程中,&arr退化為了arr,失去了陣列本來擁有的跨度。

此時p1[i],就是在對陣列中的每乙個陣列元素做遍歷了。

*/ //p儲存的是陣列的位址&arr

int *p1 = &arr; //其實此處不需要取位址,將二級指標賦值給一級指標會有警告。

for (int i = 0; i < 5; i++)

printf("------------------------------\n");

//*的優先順序為2級,、()的優先順序為1級

//p2的內容是&arr

//*p2的內容是*&arr ---> arr,即陣列的首元素位址

// int (*p2)[5] = &arr;

for (int i = 0; i < 5; i++)

printf("------------------------------\n");

/*同理,以下的說法同樣不正確:

p2此時的位址已經為arr,*p2就是陣列元素的值了。

而二級指標的特點就是在於它儲存的是一級指標的位址,即它的內容就是一級指標的位址。

*p2就是這個一級指標的位址。

*(*p2)則為對元素的值取位址,因為陣列元素的值是手動賦值的,

那麼**p此時就是對野指標的非法操作了。

*/ //p為&arr首位址

//*p為arr首元素位址

//**p為陣列元素內容

int **p = &arr;

for (int i = 0; i < 5; i++)

system("pause");

return 0;

}

陣列名和陣列名取位址 指標陣列和陣列指標的區別

一,首先我們先分析下陣列名和陣列名取位址的區別。我們都知道陣列名是陣列的首位址,然而對陣列名取位址又是什麼那?看下面一段程式你就會懂的。分析 由執行結果可知,陣列名a和 a的記憶體位址相同,我們已經知道a a 0 所以有a 1指向陣列中下乙個元素 即為在首位址2751180基礎上加int的位元組數4...

陣列名和陣列名取位址 指標陣列和陣列指標的區別

一,首先我們先分析下陣列名和陣列名取位址的區別。我們都知道陣列名是陣列的首位址,然而對陣列名取位址又是什麼那?看下面一段程式你就會懂的。然而 a代表的不是取常量a的位址,而是取陣列的位址。雖然a和 a的記憶體位址相同,但是他們的意義不相同,前者僅代表陣列的首位址,後者代表整個陣列的,他的進價單位是整...

C語言的陣列名和對陣列名取位址

相信不少的c語言初學者都知道,陣列名相當於指標,指向陣列的首位址,而函式名相當於函式指標,指向函式的入口位址。現在又這樣乙個問題,如果對陣列名取位址,那得到的會是什麼呢?很多人立刻會想到 給指標取位址,就是指標的指標,既二級指標嘛!當然這樣的結論是錯誤的,不然這篇筆記也就沒有意義了。下面我們來逐步分...