教育行業(yè)A股IPO第一股(股票代碼 003032)

全國咨詢/投訴熱線:400-618-4000

c++培訓(xùn)之指針技巧之取值

更新時間:2016年07月28日15時32分 來源:傳智播客C/C++學(xué)科 瀏覽次數(shù):

指針技巧之取值
 
在學(xué)習(xí)C語言時,指針可謂是一個較難理解的地方,為了讓同學(xué)們對指針有更進(jìn)一步的理解,這里傳授各位同學(xué)關(guān)于通過指針取值的技巧
 
1. 先思考以下的指針變量,取值后會是多少
char temp[20]={11,22,33,44,55,66,77,88,99};
char *p1 = temp;
printf("*p1=%d\n", *p1);// 想想看會是多少呢?
 
對于上例題中的結(jié)果想必很多同學(xué)知道答案,為11(你計算對了么)
咱們簡單的分析一下:因?yàn)閜1是一個指針變量,即可以存儲指針(即地址),而程序中把temp賦值給了p1,又因?yàn)閠emp為char類型數(shù)組的名字,即是下標(biāo)為0的元素的地址,所以p1這個指針變量存儲的是temp[0]這個元素的地址,*p1得到的結(jié)果為11,就不足為奇了
 
2. 接著上面的代碼,再添加如下代碼,
printf("*(p1+1)=%d\n", *(p1+1));
 
此時程序會輸出多少呢?
 
答案為22
同樣接下來咱們分析一下:因?yàn)閜1保存了temp[0]這個元素的地址,即p1指向了temp[0],而p1+1的結(jié)果可以理解為temp[1]的地址,所以*(p1+1)就是取的temp[1]的值,即22
 
 
3. (預(yù)告:接下來的是重頭戲)
接著上面的代碼,再添加如下代碼:
printf("*(char *)((short *)p1+1)=%d\n", *(char *) ((short *)p1+1));
 
此時程序會輸出多少呢?
 
答案為33
 
?????33???你是不是也有這樣的感覺,怎么計算的呢?
 
下面咱們仔細(xì)分析一下這個值為什么會是33
<1> p1 在定義的時候已經(jīng)進(jìn)行了賦值,即初始化為 temp[0]元素的地址
 
 
 
<2>根據(jù)優(yōu)先級以及結(jié)合性,對應(yīng)表達(dá)式*(char *) ((short *)p1+1)的計算先后順為:先對p1進(jìn)行臨時性的強(qiáng)制類型轉(zhuǎn)換,即此時p1這個指針變量的類型已經(jīng)變成了short*類型;但是要注意此時p1保存的還是temp[0]元素的地址;接下來要對p1進(jìn)行+1了,此時到底指向了哪里呢?
 
告訴大家一個技巧:對一個指針變量+1的時候,指針到底向后偏移多少個字節(jié),要根據(jù)指針變量當(dāng)前的類型而定,如果是char*的那么+1會向后偏移1個字節(jié),如果是short *那么+1會向后偏移2個字節(jié),如果是int* 那么就會向后偏移4個字節(jié)(具體的要根據(jù)不同的編譯器而定);
 
根據(jù)剛剛告訴大家的小技巧,試試看 (short *)p1+1會指向哪個元素呢?
 
對了,此時p1指向了temp[2]這個元素,注意,因?yàn)榇藭rp1的類型已經(jīng)轉(zhuǎn)換為short*,所以如果此時取值會根據(jù)p1指向的地址連續(xù)取2個字節(jié)的數(shù)據(jù)當(dāng)做結(jié)果 此時肯定不是33,,,有的同學(xué)已經(jīng)注意到了在最外邊還有一個(char*)即類型轉(zhuǎn)換,此時又把p1的類型轉(zhuǎn)換為char*了,然后再取值 就會得到33
 
 本文版權(quán)歸傳智播客C++培訓(xùn)學(xué)院所有,歡迎轉(zhuǎn)載,轉(zhuǎn)載請注明作者出處。謝謝!
作者:傳智播客C/C++培訓(xùn)學(xué)院
首發(fā):http://www.xamj520.com/c/ 
 
 
0 分享到:
和我們在線交談!