您的位置:首页 > 编程语言 > C语言/C++

C++ 有关指针作为函数参数的问题,自定义内存分配函数传递二级指针的问题

2020-12-09 20:51 1526 查看

如题所示,我们主要讨论在自定义的内存分配函数中通常见到的代码如下所示:

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;
}

我们看下函数运行结果:

我们看到传进去的

*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;
}

同时我们在看下结果:

我们看到对指针的操作,并没有作用到指针本身。这是因为哪怕我们传进去的是个指针,但是还是以值传递的方式传递指针的值。

具体的过程是,我们在

*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;
}

结果如下所示:

我们传进去的是指针的引用,当然会作用到指针本身。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: