以下紅色字型的說法是錯誤的:
使用一級指標來接受&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語言初學者都知道,陣列名相當於指標,指向陣列的首位址,而函式名相當於函式指標,指向函式的入口位址。現在又這樣乙個問題,如果對陣列名取位址,那得到的會是什麼呢?很多人立刻會想到 給指標取位址,就是指標的指標,既二級指標嘛!當然這樣的結論是錯誤的,不然這篇筆記也就沒有意義了。下面我們來逐步分...