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