指標與陣列 a與 a區別

2021-06-14 05:50:33 字數 1313 閱讀 7582

假設宣告了乙個陣列a,則&a表示陣列a的首位址,a與&a[0]表示陣列a首元素的首位址,那麼&a+1與a+1有哪些區別呢?通過下面的實驗來說明。

int i = 0;

int a[5]=;

int *p = (int *)(&a+1);

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

printf(" a  = 0x%p,&a = 0x%p,&a+1 = 0x%p\n",a,&a,&a+1);

printf("a+1 = 0x%p,*(a+1) = %d,p-1 = 0x%p,*(p-1) = %d\n\n",a+1,*(a+1),p-1,*(p-1));

上述程式首先宣告陣列a,包含5個元素,然後列印輸出陣列中每個元素的位址和內容;接著比較&a+1與a+1的區別。

int *p = (int *)(&a+1); ------宣告指標p指向的位址

printf(" a  = 0x%p,&a = 0x%p,&a+1 = 0x%p\n",a,&a,&a+1);

------分別 a,&a,&a+1的位址。

printf("a+1 = 0x%p,*(a+1) = %d,p-1 = 0x%p,*(p-1) = %d\n\n",a+1,*(a+1),p-1,*(p-1)); ----分別輸出a+1,*(a+1),p-1,*(p-1)

除錯過程中區域性變數位址及內容如下:

除錯結果如下:

通過以上結果分析如下:

(1)int *p = (int *)(&a+1);&a表示陣列a的首位址0x0012ff44,p的位址為

0x0012ff58,p的位址與&a+1的位址相同。

&a+1:取陣列a的首位址0x0012ff44,該位址加上sizeof(a)的值,即

&a+5*sizeof(int)=0x0012ff44+5*4=0x0012ff44+0x14=0x0012ff58。

p-1=0x0012ff58-sizeof(int)=0x0012ff54

=0x0012ff44+0x10=

0x0012ff44+4*sizeof(int) ,

即p-1與陣列元素

a[4]的位址相同,*(p-1)= a[4]=5。

(2)*(a+1) a+1是陣列a下乙個元素的位址,即 &a[1]=0x0012ff44+sizeof(int)=0x0012ff48,即*(a+1)=a[1]=2

陣列指標與指標陣列區別

前提 陣列指標是指標 指標陣列是陣列 示例 int p1 5 和 int p1 5 前者為指標陣列 後者為陣列指標。涉及運算符號優先順序 陣列下標比取值運算子 的優先順序更高。自右向左結合。先結合陣列下標.先談指標陣列 int p1 5 指向整型資料的指標變數。0 1 2 3 4 int 結論 指標...

指標與陣列區別

1 從編譯層面看c語言中指標與陣列的區別 一 理論分析 編譯器在處理指標與陣列的時候,是區別對待的。對於指標 int p p 是乙個變數,所以編譯器要為之分配乙個空間。comm p,4 對於陣列 int a 10 a 是乙個位址,編譯器會為陣列 a 分配乙個空間,但不會為 a 本身分配空間,在使用到...

指標與陣列區別

c c 程式中,指標和陣列在不少地方可以相互替換著用,讓人產生一種錯覺,以為兩者是等價的。陣列要麼在靜態儲存區被建立 如全域性陣列 要麼在棧上被建立。陣列名對應著 而不是指向 一塊記憶體,其位址與容量在生命期內保持不變,只有陣列的內容可以改變。指標可以隨時指向任意型別的記憶體塊,它的特徵是 可變 所...