文章來源:https://yian.me/blog/what-is/pointer-to-pointer-in-c-programing-language.html?utm_source=tuicool&utm_medium=referralhtml
做者: Y!an面試
「int** 是什麼」 這個問題其實不難。算法
咱們能夠遞歸分析,先看下int* 是什麼,嗯?好像還能夠繼續遞歸到int學習
咱們都知道,int 是 C 的基礎數據類型整型 ,而多了個* 的int* 是指向整型變量的指針,那麼int** 是什麼就不言自明瞭,列個表:ui
看到這裏,你對int**應該有了個初步的認識,但你可能以爲有點繞,不要緊,下面咱們寫一段代碼看看:指針
#include <stdio.h>視頻
int main()htm
{blog
int i = 418;遞歸
int* pi;
// 根據上面的表格,咱們知道 int* 是指向「整型」的指針,
// 那麼 pi 能夠保存的是 int 類型的變量 i 的地址:
pi = &i;
int** ppi;
// ppi 能夠保存的是 int* 類型的變量 pi 的地址:
ppi = π
// 恭喜你,如今你已經知道了怎麼定義 int** 類型的變量和給它賦值
// 咱們先寫到這裏
return 0;
}
假如定義有int** p(爲了方便,咱們暫且把p認爲是ppi的別名),那麼p,*p,**p,p + 1,*p + 1,*(p + 1),**p + 1,*(*p + 1),**(p + 1)分別是什麼?
乍一看有點多,開始有點慌是吧,不要緊,咱們先看不帶加法運算的前三個:p,*p以及**p
從上面的代碼咱們已經知道p就是存放int*類型變量的地址的變量
// 從上面暫停下來的地方咱們繼續
// 咱們都知道,在指針前面加個 * 就是「取得這個指針指向的地址裏的值」
// 由於 pi 存放的是 i 的地址,那麼 *pi 就是取得 i 存放的值,類型是 int
// 同理,*ppi 取得的是 pi 存放的值,類型是 int*
printf("*pi = %d, *ppi = %p\n", *pi, *ppi);
// 輸出 *pi = 418, *ppi = 0000002D6FF2FD58 (*pi = 後面的值在每臺機器上均可能不同)
// 既然 *ppi 是 int*,那也就是說咱們還能夠對它再作一次解引用,
// 拿到 *ppi 這個地址裏存放的值,類型是 int
printf("**ppi = %d\n", **ppi);
// 輸出 **pi = 418
這時,你已經掌握p,*p以及**p分別是什麼了
接下來咱們仍是先挑最簡單的,把不帶*的拿出來:p + 1,指針p作了個加法運算。
那麼它加的這個1是什麼?數字1?1位?1字節?
都不是,C指針加法運算裏的數字操做數的單位是指針的長度,也就是說p + 1表示的時候內存中,緊挨着p的下一個可用空間的地址:
printf("ppi = %p, ppi + 1 = %p\n", ppi, ppi + 1);
// 輸出 ppi = 0000008CA96FFB78, ppi + 1 = 0000008CA96FFB80
// 而且咱們能夠看到 0000008CA96FFB80 - 0000008CA96FFB78 = 8(16進制)
// 剛好等於 x64 系統下 1 個指針的大小:8 字節
那*(p + 1)是什麼你應該也知道了,就是p + 1這個地址(假設是合法的)存放的值,類型是int*。
而*p + 1就是*p這個地址再偏移了 1 個指針長度
printf("*ppi = %p, *ppi + 1 = %p\n", *ppi, *ppi + 1);
// 輸出 *ppi = 0000002D6FF2FD58, *ppi + 1 = 0000002D6FF2FD60
printf("pi = %p\n", pi);
// 輸出 pi = 0000002D6FF2FD58
// 能夠看到 *ppi == p
好了,還剩下最後三個:**p + 1,*(*p + 1),**(p + 1),先試試結合上面的知識,想一下在咱們的例子中這三個分別是什麼,想好以後再看下面的答案檢驗一下本身理解得對不對:
**p + 1:**p取得的是int,值是 418,因此**p + 1是 419
*(*p + 1):*p + 1是0000002D6FF2FD60,那麼*(*p + 1)就是取得這個地址中的值(假設地址都是合法的)
**(p + 1):先對p + 1這個地址作解引用,獲得新的地址*(p + 1),而後再對新的地址作解引用,獲得的是個int(假設地址都是合法的)
如今再給你int***,相信你也知道它是什麼而且知道它相關的運算是什麼了:
最後
特別推薦一個分享C/C++和算法的優質內容,學習交流,技術探討,面試指導,簡歷修改...還有超多源碼素材等學習資料,零基礎的視頻等着你!
還沒關注的小夥伴,能夠長按關注一下: