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