指標的用法

TuxedoLinux發表於2018-05-24
雙重指標的用法

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 中

相關文章