雙重指標的用法
22、指標一直都是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 中
指標的指標的用法
直接上 用途 使用乙個函式動態申請記憶體,並賦值。跳出呼叫函式後輸出賦值內容 cpp include include typedef struct data data void fun data p int main void fun data p 我建議你直接執行看看結果,你會發現執行出錯,在這裡...
指標的用法
c 中,成員指標是最為複雜的語法結構。但在事件驅動和多執行緒應用中被廣泛用於呼叫回叫函式。在多執行緒應用中,每個執行緒都通過指向成員函式的指標來呼叫該函式。在這樣的應用中,如果不用成員指標,程式設計是非常困難的。剛遇到這種語法時也許會讓你止步不前。但你會發現,使用恰當的型別定義之後,複雜的語法是可以...
this指標的用法
1.this指標的用處 乙個物件的this指標並不是物件本身的一部分,不會影響sizeof 物件 的結果。this作用域是在類內部,當在類的非靜態成員函式中訪問類的非靜態成員的時候,編譯器會自動將物件本身的位址作為乙個隱含引數傳遞給函式。也就是說,即使你沒有寫上this指標,編譯器在編譯的時候也是加...