我們先看下面這段**:
#include
intmain()
;int
*p =
(int*)
(&arr+1)
;//&arr操作的是整個陣列,返回的指標指向整個陣列,&arr+1偏移的是整個陣列的長度。
printf
("%p %p \n"
,arr,
&arr)
;printf
("%p %p \n"
,arr+1,
&arr+1)
;printf
(" %d %d \n",*
(p-1),
*p-1);
printf
("%ld %ld \n"
,sizeof
(arr)
,sizeof
(&arr));
return0;
}
執行結果!
0x7ffc9973b2e0
0x7ffc9973b2e0
0x7ffc9973b2e4
0x7ffc9973b2f4
532763
208
1.&arr是操作的整個陣列,+1後偏移的是整個陣列的大小,int型別為4個位元組陣列中有5個int大小的元素,所以偏移的大小為20個位元組。
2.&arr+1返回的是乙個陣列指標,我們要把他強轉為int型別的指標,這樣我們後面偏移的就是4個位元組。
3.sizeof(arr)計算的是整個陣列的大小,sizeof(&arr)計算的指標的大小,&arr是乙個陣列指標,指標在64位作業系統中佔8個位元組,在32位作業系統中佔4個位元組。
4.在*p-1中,陣列越界,讀到了記憶體中ebp-1的值(ebp我也清楚,就是越界了,哈哈)
C語言 陣列首位址問題小記
include includeint main 以十六進製制列印陣列的首位址 這裡a與 a,a 0 一樣的結果 printf x n a printf x n a printf x n a 0 以十進位制列印陣列的首位址 printf d n a 輸出第乙個陣列元素的值 printf d n a 0...
取多維陣列首位址的方法
include include int main void char a 1 1 char a 2 2 3 對一維陣列取首位址,有兩種方法 char pa a 第一種 char pa a 0 第二種 char pa a 0 0 取二維陣列首位址的方法 char pa a 0 0 0 取三維陣列首位址...
陣列首位址
指標可以,開始我們說了指標可以認為是游離的,所以他本身的值可以變化,而自加就是讓指標的首位址變化,但是陣列是固定的,要變化乙個陣列的首位址就要用到雙指標。unsigned char p1 f 30 unsigned char p1 b 300 void change page unsigned ch...