2017年11月18日 星期六

在不同的scope修改變數的值

其實一直知道就是要透過指標來完成
但是如果是要修改指標呢??那就要透過指標的指標來修改

舉例:

void modify(int *p){
     p = (int*)malloc(sizeof(int*));
     printf("address of ptr in modify(int*) = %p\n", ptr);
}
int main(){
    int *ptr = NULL;
    modify(ptr);
    printf("address of ptr in main() = %p\n", ptr);
    return 0;
}

比較粗心的人可能會覺得應該會印:
-------待補-------------
但是實際上的輸出是這樣:
------------待補------------

其實道理都一樣,如果要改到非自己scope的變數時(不管是不是指標),傳一個星星進去就對了!
為什麼是這樣呢?
我們呼叫function的時候,function會複製一份參數,所以當然傳過去改到的東西就只是在function scope 裡面改而已,想要改到我們原本傳入的參數,必須要傳入他的指標(如果是指標就傳指標的指標,如果是指標的指標就傳指標的指標的指標@@)

這樣function複製的東西就是我們要改的變數的指標了,因此我們可以再透過這個指標來改變他指向的變數

所以上面的程式應該要改成這樣:
void modify(int **p){
     p = (int*)malloc(sizeof(int*));
     printf("address of ptr in modify(int*) = %p\n", ptr);
}
int main() {
    int *ptr = NULL;
    modify(&ptr);
    printf("address of ptr in main = %p\n", ptr);
    return 0;
}

這樣就會是我們想要的結果了!