指標的用法
雙重指標的用法
2、指標一直都是C語言的靈魂,我們平常用得最多的是一維指標,而雙重指標用得相對較少,本文是對二維指標進行一個學習。
首先看一道習題:
char GetMemory(char *memorystr,u8 num)
{
memorystr = (char*)malloc(num);
}
int main(void)
{
char *str = NULL;
GetMemory(str,6);
memcpy(str,"china",5);
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
請問上面程式碼,可以為str開闢一個空間並且把”china” 拷貝到其中嗎?
分析:
要了解這個問題,我們需要先了解函式呼叫的過程:
1)首先把實參的值賦給形參,然後把控制流轉到被呼叫函式。
2)執行被呼叫函式。
注意形參改變是不會影響到實參的值。我們再分析GetMemory(str,6),實參是一個空指標str,形參為memorystr,呼叫時,把str賦給memorystr,然後執行memorystr = (char*)malloc(num);,這時候 memorystr獲得了6個char空間,但是因為形參改變不會影響到實參的值,str的值並沒改變,還是NULL,所以上面拷貝不成功。
我們根據下圖來說明:
ps: 我們平常使用指標把引數從函式中傳遞出來,傳遞的是指標所指向的內容,而非指標本身,而上的例子企圖改變的是指標本身。
如果例子想達到目的,該怎麼改呢? 我們可以使用雙重指標實現。所謂雙重指標,也稱為二維指標,宣告形式
型別名 **指標名, eg: char **p, 含義是指向指標的指標。
如下圖:
char **p = “123”:
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)// 使用二級指標
{
*memorystr = (char*)malloc(num);// 這裡是賦值給*memorystr
}
int main(void)
{
char *str = NULL;
GetMemory(&str,6);// 取str的地址
memcpy(str,"china",5);
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
分析:
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 中
相關文章
- C++ 中 this 指標的用法詳解C++指標
- 成員變數/函式指標的用法 (轉)變數函式指標
- 詳解c++指標的指標和指標的引用C++指標
- 指向指標的指標指標
- 【char* 字元指標的用法】及【輸出NULL的問題】字元指標Null
- 指標的理解指標
- 空指標的救星指標
- 如何理解指向指標的指標?指標
- 指標問題的一點體會(區別 [指向指標的指標] 與 [指標的指標] .) (轉)指標
- 字串指標的輸出字串指標
- 空指標的傳說指標
- const指標的引用指標
- 智慧指標的那些事指標
- OC指標的本質指標
- C/C++指向指標的指標C++指標
- 關於指標傳遞和指標的指標指標
- 指標常量和常量指標的區別指標
- 指標的詳細講解指標
- 指標的刪除動作指標
- 引用與指標的區別指標
- 指標的申明和定義指標
- 淺析weak指標的實現指標
- 關於 智慧指標的東西指標
- 各種智慧指標的介紹指標
- Faster\Slower 快慢指標的應用AST指標
- 陣列和指標的問題陣列指標
- 聊聊C語言和指標的本質C語言指標
- 二維陣列的指標的理解陣列指標
- 有關指標的那些事兒《一》指標
- 建立存放指標的容器並讀出指標
- JavaScript 獲取滑鼠指標的座標JavaScript指標
- JavaScript 跟隨滑鼠指標的粒子效果JavaScript指標
- bad 指標的這種錯誤指標
- C++引用比指標的好處C++指標
- 各種語言中對指標的叫法指標
- C++引用與指標的比較C++指標
- C++ 指標陣列與陣列指標的區別C++指標陣列
- 【C進階】26、指標的本質分析指標