前兩天在網上看了一道關於指標的題,對於我這種,看到指標就矇圈的人來說,挺有意思,下面就這道題,咱好好看看。
#include
void
f(
char
**p)
main()
,**p;
p = a;
f(p);
printf(
"%s\r\n"
,*p);
}
最後列印出來的應該是啥呢
我一開始寫的是456,但其實是3
在vs上執行了下,確實是3,這是為啥呢?
char *a 表示的是一組指標陣列,每個元素是char型別指標。也就是說,陣列裡面指向的是一系列指標的位址,而不是字元的位址;
char **p 表示指向指標的指標,其實跟*a是一樣的,你可以認為 **p=*a;
首先,a[0]指向的是第乙個字串的第乙個字元,
a[1]指向的是第二個字串的第乙個字元,
a[2]指向的是
第三個字串的第乙個字元,
既然*a=**p,那麼a=*p,
再往下,a=p,而a指向的為第乙個字串的第乙個字元, 所以,p指向的為第乙個字串的第乙個字元,
再看,a+2=a[1],也就是說,*(p+2)=a[2] 也就是456
那為啥*p+=2 最後出來的是3呢?
看下面
a[0] a[1] a[2]
m g n k
1 2 3 \0 a b c \0 4 5 6 \0
a[0],a[1],a[2] 裡面分別存的是指向 1、a、4的指標m、n、k,
a[0]++肯定是a[1],這沒毛病, p=a,那p++,*p=a[1]也沒毛病;
但是!!!!
*p指向的是m,所以,如果是*p=*p+1,那就是m++,即g的位置;
如果是p++,那就是n的位置,
注意啊,這裡 *p++與*p=*p+1不同,*p++=*(p++)=*(p+1)!=*p+1這點要切記!
最後 記住這個 i=*p++意思就是先取值後+1
! 經常容易混了。
關於指標強制型別轉換的思考
說不上是思考,只是想談談自己對指標的強制型別轉換的理解。之所以寫出來,一方面是自己做乙個筆記,另一方面也可以和大家 更重要的也是向大家學習。以前總是記不住指標的強制型別轉換的格式,歸根結底還是自己對這個知識點不夠理解。什麼是指標變數 指標變數,本質上是乙個變數,只是它是存放位址的變數,指標的型別代表...
關於指標的一點思考
指標是乙個變數,所不同的是,它存的是位址。因為資料型別決定著如何解釋這個位址 位元組數和操作 因此根據的資料型別的不同,指標又有不同的型別。某個物件 a 的位址範圍為 a,a size n 其中size n是a所佔的位元組數 比如乙個一維陣列int a 10 位址範圍為 a,a 10 sizeof ...
關於快排指標的幾點思考
近來復盤劍指offer21題的時候,得到了新的體會,特來分享一下。我們都知道 maybe you do not know 應用快速排序時,我們需要維護兩個指標,但是具體指標初始化在 具體如何移動,終止條件又是如何,我們來具體 一下。一般而言,這兩個指標有兩種形式,一種是一前一後,當然另一種也是一前一...