關於指標的思考

2021-07-15 00:27:20 字數 1330 閱讀 8414

前兩天在網上看了一道關於指標的題,對於我這種,看到指標就矇圈的人來說,挺有意思,下面就這道題,咱好好看看。

#include

voidf(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 應用快速排序時,我們需要維護兩個指標,但是具體指標初始化在 具體如何移動,終止條件又是如何,我們來具體 一下。一般而言,這兩個指標有兩種形式,一種是一前一後,當然另一種也是一前一...