試題練習總結(指針加法)

例題:有下列一段代碼,請說明p++的含義()

int arr[10]={1,2,3,4,5};
int *p=arr;
*p=10;
p++;
*p=20;

A、加一個字節                              B、加一個單元格                                             C、加一個數組

這道題的正確答案是B。解析如下:

先運行一個程序,得到的結果如下圖所示:

首先看一下題目,就知道絕對不能是加一個數組。

假設這個數組的存放地址如下圖所示:

     如果是加一個字節,那是怎麼加的呢?將存儲數據的單元格子放大一下,然後將每一個數字轉化爲十六進制數字,十進制數字10轉換爲十六進制數字是0x0000000a,十進制數字20轉換爲十六進制數字是0x00000014,如果是加一個字節,此時的指針應該是指向如圖所示的位置:

有人會問數字爲什麼會是那樣分佈的,此處添加一個小的知識點:

小端:低地址內放數據的低位字節     大端:低地址放數據的高位字節

如果將0x12345678放入格子中,應該怎樣放的呢?應該是如下圖所示那樣放置的:

如圖所示,因爲78的權重比12的權重小,所以78應該放在低地址位,12應該放在高地址位,所以纔會向上圖所示的那樣放置。所以上面的數字纔會像第二幅圖那樣添加進去。這個時候arr[0]裏面的數字是0x0000140a,轉換成十進制數字爲5130,不是預想中的10。arr[1]裏面的數字是0x00000002,轉換成十進制數字爲2,不是預想中的20。

所以p++也不是加一個字節。那就只能是加一個單元格了。如圖所示:

 這個時候arr[0]裏面的數字是0x0000000a,轉換成十進制數字爲10,與預想中的一樣。arr[1]裏面的數字是0x00000014,轉換成十進制數字爲20,也與預想中的一樣。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章