例題一:
輸出結果爲:
答案錯誤:
正確結果爲:2,5
(看代碼想象成看內存)
解析:
&a取出的是整個數組的地址,+1將會跳過整個數組的空間
a是數組的首元素的地址,+1將會指向數組的第二個元素
由於將數組的地址強制類型轉化爲int的地址
因此指針變量ptr+-整數時跳過的將是int類型大小的空間
2.例題二:
將0x100000這個整型強制類型轉化爲結構體指針類型
答案爲:
解析:
p是全局變量
p爲結構體指針變量
結構體指針類型爲struct Test *
0x1就是16進制的1,就是數字1
結構體指針+1,跳過整個結構體類型的大小
unsigned long類型的數據+1,就是整數0x100000+0x1=0x100001
unsigned int指針加1,跳過4個字節空間的大小
3.例題三:
答案正確
解析:
%x打印的是16進制數字
0x後面的0會省略
可是若是是地址就不會省略
例:16進制的打印:0x02就會打印成2
地址的打印(是以16進制打印):0x001233就會打印成00112233
地址是由低到高的
咱們的vs編譯器是小端存儲模式(數據的高位放在低地址處)(即倒敘存儲)(int)a將數組名,即首元素的地址強制類型轉化爲整形數字+1
在將其轉化爲整形指針存儲在ptr2中
內存中的空間大小是以一個字節爲單位的
那說明首元素地址將+1個字節,跳爲後面一個字節的地址
int類型的指針,能訪問4個字節的空間,
又由於數組的內容是連續存儲的
因此解引用ptr2將讀取內存中的00 00 00 02
即20 00 00
16進制的打印:0x02就會打印成2
4.例題四
答案錯誤
解析:
(0,1)是逗號表達式,最後一個表達式做爲整個表達式的結果,因此數組裏面初始化爲{1,3,5}由於是3*2的二維數組,因此連續將空間裏面的值初始化爲1 3 5剩下的元素都默認初始化爲0
數組的初始化是使用{}
即int a[3][2] = {{0,1},{0,1},{0,1}};
將二維數組當作一維數組,每一個元素爲每一行的首元素的地址
a[0]至關於第一行的一維數組名,這個數組名是首元素地址
將這個首元素地址放在所對應的指針變量int*中
因此p[0]至關於*(p+0)也至關於a[0][0]
5.例題五:
答案:
解析:
a是一個5*5的int類型的二維數組
p 是指向int類型,有4個元素的數組指針
p中存放的是一個二維數組的首元素地址
因此p+1將跳過4個int類型的元素
(相同類型時)地址-地址將獲得元素個數(4個)
(計算方式(16進制地址-16進制地址)/類型大小)(16/4=4)
又由於低地址-高地址將獲得負數
因此獲得-4
-4是以補碼形式存儲
%d是以十進制形式打印,因此直接是-4
%p是以地址16進制形式打印,地址是無符號整數,因此地址中-4的補碼爲原碼
4個二進制位轉換爲一個16進制位,因此-4所轉化的地址爲0xFF FF FF FC
6.例題六
答案正確
&數組名,取出的是整個數組的地址,這是數組的地址
整個數組的地址+1,將跳過整個數組的大小
*整個數組,將獲得這個數組的首元素的地址,這是單個元素的地址
至關於(*與&抵消了)剩下單個的數組名,即爲首元素的地址,這也是單個元素的地址
aa是二維數組名,也是一維數組地址
能夠將二維數組名aa看作有n行個一維數組地址的集合,是一維數組的首元素地址
因此aa+1將跳過一維數組的大小
*(aa+1)將取得這個一維數組的首元素的地址
*(aa+1)也可寫做aa[1]
即爲二維數組第二行首元素的地址
實際上,二維數組的存儲也是線型的,爲方便理解,咱們能夠將其當作矩陣座標的形式
解析:
7.第七題:
答案正確
解析:
一維數組的數組名錶示首元素地址
二級指針變量用來存放一級指針的地址
char*字符指針能夠用來接收字符串,裏面存放的是首字符的地址
因此a是一個一維數組,數組的每一個元素類型爲char*存放首字符的地址
pa+1將跳過一個字符指針地址的大小
因此pa將指向字符a的地址,解引用打印%s將打印at
8.第八題:
答案:
解析:
內存佈局:
1.**++cpp
cpp先++在**兩次解引用
cpp指向的是cp的首元素的地址,cpp++將指向cp第二個元素的地址,解引用獲得cp第二個元素空間中存儲的c+2的地址,再解引用獲得字符p的地址,%s打印獲得POINT
2.--++cpp+3
先++後解引用*再--再解引用*再+3
第一步中cpp已經加1
因此++時將指向cp第三個元素的地址,解引用獲得cp第三個元素空間中存儲的c+1的地址,再--,地址--,減去一個字節的大小,獲得c的地址,而且將c++1改成c,再解引用獲得字符E的地址,再加3,獲得第四個元素的地址,%s打印ER
3.*cpp[-2]+3
*cpp[-2]+3至關於*(*(cpp-2))+3
4.cpp[-1][-1]+1
cpp[-1][-1]+1至關於*(*(cpp-1)-1)+1c++