指向指標的指標
指標變數在記憶體中會占用一定的空間
可以定義指標來儲存指標變數的位址
int** pp本質上還是指標,只是兩個**告訴你這是乙個指向指標的指標char** p = null;
char* p2;
p = &p2;
給p賦值沒有問題,但怎麼使用p 呢?這就需要我們前面多次提到的鑰匙(*)
第一步:根據 p 這個變數,取出它裡面存的位址。
第二步:找到這個位址所在的記憶體。
第三步:用鑰匙開啟這塊記憶體,取出它裡面的位址,*p 的值。
第四步:找到第二次取出的這個位址。
第五步:用鑰匙開啟這塊記憶體,取出它裡面的內容,這就是我們真正的資料,**p 的值。
我們在這裡用了兩次鑰匙(「*」)才最終取出了真正的資料。也就是說要取出二級指標所真正指向的資料,需要使用兩次兩次鑰匙(「*」)。
至於超過二維的陣列和超過二維的指標一般使用比較少,而且按照上面的分析方法同樣也可以很輕鬆的分析明白,這裡就不再詳細討論。
為什麼需要指向指標的指標?
.指標本質上也是變數
.對於指標也同樣存在傳值呼叫與傳址呼叫
二維陣列與二級指標
二維陣列在記憶體中以一維的方式排布
二維陣列中的第一維是一維陣列
二維陣列中的第二維才是具體的值
二維陣列的陣列名可看做常量指標
例1:以一維下標的方式遍歷二維陣列
void printarray(int a, int size)
編譯警告:執行結果:
當陣列名a 作為右值時,代表的是陣列首元素的首位址。這裡的a 為二維陣列,我們把陣列a 看作是包含5 個int 型別元素的一維陣列,裡面再儲存了乙個一維陣列。如此,則a 在這裡代表的是a[0] 的首位址。a+1 表示的是一維陣列a 的第二個元素。a[4]表示的是一維陣列a 的第5 個元素,而這個元素裡又存了乙個一維陣列。所以&a[4][2]表示的是&a[0][0]+4*5*sizeof(int) + 2*sizeof(int) 。
根據定義,p 是指向乙個包含4 個元素的陣列的指標。也就是說p+1表示的是指標p 向後移動了乙個「包含4 個int 型別元素的陣列」。這裡1 的單位是p 所指向的空間,即 4*sizeof(int) 。所以,p[4]相對於p[0]來說是向後移動了4 個「包含4 個int 型別元素的陣列」,即&p[4]表示的是&p[0]+4*4*sizeof(int) 。由於p 被初始化為&a[0] ,那麼&p[4][2]表示的是&a[0][0]+4*4*sizeof(int)+2* sizeof(int) 。
再由上面的講述,&p[4][2] 和 &a[4][2] 的值相差4 個int 型別的元素。現在,上面測試出來的結果也可以理解了吧?其實我們最簡單的辦法就是畫記憶體布局圖:
這裡最重要的一點就是明白陣列指標p 所指向的記憶體到底是什麼。解決這類問題的最好辦法就是畫記憶體布局圖。
例3:以指標的方式遍歷二維陣列
例4:動態申請二維陣列(以二維指標模擬)
小結:
c語言中只有一維陣列,而且陣列大小必須在編譯期就作為常數確定
c語言中的陣列元素可以是任何型別的資料,即陣列的元素可以是另乙個陣列
c原因呢中只有陣列的大小和陣列首元素的位址是編譯器直接確定的
多維陣列 和 多維指標
指標變數在記憶體中會占用一定的空間。可以定義指標來儲存指標變數的位址值。舉例 舉例說明,多級指標的使用,重置動態空間大小 include include int reset char p,int size,int new size else return ret int main return 0 ...
多維陣列和多維指標
專題四 指標和陣列 下 包括以下章節 指標變數在記憶體中會占用一定的空間可以定義指標來儲存指標變數的位址值為什麼需要指向指標的指標?指標在本質上也是變數 對於指標也同樣存在傳值呼叫與傳址呼叫 2 1.c include include char p p指向的是乙個char 指標 int size 原...
多維陣列和多維指標
int main 示例 功能 重置動態空間大小 include include int reset char p,int size,int new size printf n printf n printarray p,9 return 0 執行結果 示例 功能 動態申請二維陣列 include i...