雙重指標的用法

2021-08-28 07:32:02 字數 1743 閱讀 8753

前言 

1、本人qq – 330952038 歡迎一起學習交流。 

2、指標一直都是c語言的靈魂,我們平常用得最多的是一維指標,而雙重指標用得相對較少,本文是對二維指標進行乙個學習。

首先看一道習題:

char getmemory(char *memorystr,u8 num)

int main(void)

請問上面**,可以為str開闢乙個空間並且把」china」 拷貝到其中嗎?分析:要了解這個問題,我們需要先了解函式呼叫的過程: 

1)首先把實參的值賦給形參,然後把控制流轉到被呼叫函式。 

2)執行被呼叫函式。 

注意形參改變是不會影響到實參的值。我們再分析getmemory(str,6),實參是乙個空指標str,形參為memorystr,呼叫時,把str賦給memorystr,然後執行memorystr = (char*)malloc(num);,這時候 memorystr獲得了6個char空間,但是因為形參改變不會影響到實參的值,str的值並沒改變,還是null,所以上面拷貝不成功。 

我們根據下圖來說明: 

ps: 我們平常使用指標把引數從函式中傳遞出來,傳遞的是指標所指向的內容,而非指標本身,而上的例子企圖改變的是指標本身。

如果例子想達到目的,該怎麼改呢? 我們可以使用雙重指標實現。所謂雙重指標,也稱為二維指標,宣告形式 

型別名 **指標名, eg: char **p, 含義是指向指標的指標。 

如下圖: 

1)首先申請了乙個空間,我們假設位址為a,a位址內容是p,p是乙個二級指標,指向以p為位址的空間,則其內容為*p。 

2)*p時乙個一級指標,指向以*p為位址的空間,該空間儲存的是」123」 

3)引用二級指標,修改*p 的值就可以改變二級指標(**p)所指向的位址。通過函式引數形式修改指標位址,一般使用二級指標。 

eg: 

char **p =」123」 , *a = 「456」; *p = a; 這時候,**p指向的內容是「456」

根據這些知識,我們修改上面的例程,以實現其功能:

char getmemory(char **memorystr,u8 num)// 使用二級指標

int main(void)

分析: 

1、getmemory(&str,6);// 取str的位址,賦給了二級指標memorystr, 那麼*memorystr就是取&str位址的內容,即str,兩者完全等價。如果*memorystr改變,那麼str也會改變。

2、*memorystr = (char*)malloc(num);// 申請num個char空間給*memorystr,也就是給str申請了num個char空間。

3、最後把字串copy到china 中。

align 雙重指標 結構體指標

align 關鍵字指示編譯器在 n 位元組邊界上對齊變數。align 是乙個儲存類修飾符。它不影響函式的型別。語法 align n 其中 n 是對齊邊界。對於區域性變數,n 值可為 1 2 4 或 8。對於全域性變數,n 可以具有最大為 2 的 0x80000000 次冪的任何值。align 關鍵字...

雙重指標動態開闢記憶體

a 10 10 你要想用乙個指標指向這個多維陣列的話那就需要乙個雙重指標int p a int a 2 指標陣列 int a 2 陣列指標 int a 2 a是乙個陣列名 int a 2 a是乙個指標,指向int x 2 型別的陣列 但本質上兩者都存的是陣列的首位址 為陣列開闢記憶體空間 int a...

指標的指標的用法

直接上 用途 使用乙個函式動態申請記憶體,並賦值。跳出呼叫函式後輸出賦值內容 cpp include include typedef struct data data void fun data p int main void fun data p 我建議你直接執行看看結果,你會發現執行出錯,在這裡...