C++ 有關指標作為函式引數的問題,自定義記憶體分配函式傳遞二級指標的問題
阿新 • • 發佈:2020-12-10
如題所示,我們主要討論在自定義的記憶體分配函式中通常見到的程式碼如下所示:
``` void Create(A** addr); ```
其中傳遞的引數是二級指標。為什麼?
我們先看一下完整的動態記憶體分配函式的簡單例子:
```
struct A {
int a = 0;
int b = 0;
int c[3];
};
void Create(A** addr) {
printf("a1: %p\n", addr);
*addr = new A();
printf("a2: %p\n", addr);
}
int main() {
A *a;
printf("a0: %p\n", a);
Create(&a); // 傳遞二級指標值
printf("a4: %p\n", a);
return 0;
}
```
我們看下函式執行結果:
![](https://img2020.cnblogs.com/blog/1806982/202012/1806982-20201209203612244-1785239572.png)
我們看到傳進去的```*a```的值改變了,而且這個改變作用到了```*a```本身
在看下我們一般情況下想到的分配方式:
```
struct A {
int a = 0;
int b = 0;
int c[3];
};
void Create(A* addr) {
printf("a1: %p\n", addr);
addr = new A();
printf("a2: %p\n", addr);
}
int main() {
A *a = nullptr;
printf("a0: %p\n", a);
Create(a); 傳進去指標本身
printf("a4: %p\n", a);
return 0;
}
```
同時我們在看下結果:
![](https://img2020.cnblogs.com/blog/1806982/202012/1806982-20201209204019804-1004988700.png)
我們看到對指標的操作,並沒有作用到指標本身。這是因為哪怕我們傳進去的是個指標,但是還是以值傳遞的方式傳遞指標的值。
具體的過程是,我們在```*a```傳遞到函式裡面時,函式自身建立了一箇中間變數,我們姑且稱他為```temp```,這個temp的值為 ```a```,我們後面進行```new```之後也只是簡單的將
分配後的記憶體地址給了temp,所以才會出現上面結果。
**但是**對於二級指標而言,傳進去的是指標的地址,對指標地址所指值進行操作,當然會改變指標本身的值。
其實該種方式也可以等價於:
```
struct A {
int a = 0;
int b = 0;
int c[3];
};
void Create(A* &addr) {
printf("a1: %p\n", addr);
addr = new A();
printf("a2: %p\n", addr);
}
int main() {
A *a;
printf("a0: %p\n", a);
Create(a);
printf("a4: %p\n", a);
return 0;
}
```
結果如下所示:
![](https://img2020.cnblogs.com/blog/1806982/202012/1806982-20201209204758037-1170621141.png)
我們傳進去的是指標的引用,當然會作用到指標