當前位置:文思屋>學習教育>考研>

青牛軟體筆試經驗

文思屋 人氣:2.41W

青牛軟體筆試經驗分享:

青牛軟體筆試經驗

1 第一個
 
void main()
{
    int a[5] = {1,2,3,4,5};
    int *ptr = (int *)(&a + 1);
    int *ptr2 = a+1;
    printf("%d,%d,%dn", *(a+1), *(ptr-1), *(ptr2-1));
}
 
輸出為2,5,1
問題:中間那個5是怎麼來的?

解答:北郵論壇提供

int a[5] = {1,2,3,4,5};
此語句會讓系統在棧記憶體中分配5個連續的int型(32位機是四個位元組)空間
a是一個指標常量,a應該是被分配在靜態儲存區(不敢肯定,望大牛解惑 當然不是,是存在棧空間的動態儲存的,這我自己知道),並且有一個固定的值
假設該陣列的首地址為4000,即a的值是4000,那麼陣列元素5的地址應該是&a[4] = 4000+4*4 = 4016 
另外假設a的地址是3000
 
int *ptr = (int *)(&a + 1); 
指標做加法時,我們要關心的不是指標本身,而是指標所指向的資料型別
很明顯&a是一個指標(指標和地址的概念是等價的,若對這句話有異議,我們可以一起討論),這個指標所指向的是a
而a是一個數組型別(注意,這裡不能將a理解為一個指標常量,陣列和指標的區別還是很大的),sizeof(a) = 20
所以 ptr = &a+1 = 3000+20 = 3020,在將其轉換為int*型
所以ptr-1 = 3020 - 4 = 3016, 這片記憶體中的數是不確定的, 所以第二個打印出來5完全是碰巧的,要不就是編譯器的問題
 
樓主是不是這樣想的?其實這還是搞混了陣列和指標
記住,陣列就是陣列,指標就是指標,千萬不要混用(雖然有時候混用是正確的.). 只有當陣列以實參傳遞給函式時,它才會變成指標。
這道題我們應該這樣理解:
a是一個int[5]型的陣列,那麼&a自然是指向這個陣列(千萬不要以為&a指向一個指標常量,這就是上面所犯的錯誤),那麼&a+1自然是指向下一個陣列
所以 ptr = 4000 + 20 = 4020 , 而不是3016。