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; }
结果如下所示:
我们传进去的是指针的引用,当然会作用到指针本身。
相关文章推荐
- c++之指针作为函数参数传递的问题
- c++指针作为函数参数传递的问题
- c++之指针作为函数参数传递的问题
- C++指针作为函数的参数进行传递时需要注意的一些问题
- c++之指针作为函数参数传递的问题
- 结构体指针作为函数参数传递却无法传值的有关问题
- c++之指针作为函数参数传递的问题
- c++之指针作为函数参数传递的问题
- c++之指针作为函数参数传递的问题
- C++指针作为函数的参数进行传递时注意的问题
- C++指针作为函数的参数进行传递时注意的问题
- c++之指针作为函数参数传递的问题
- C++指针作为函数参数的问题
- 关于指针作为函数参数传递的理解,对比普通变量作为函数参数的需注意点,其实就是行参和实参的问题。
- 指针作为函数的参数传递的问题
- C语言一级指针、二级指针、数组作为参数传递需要注意的若干问题
- C++ 常量指针或者常量引用作为函数参数传递的原因
- C++传递对象函数指针作为参数
- 指针作为函数的参数传递的问题
- C++中关于将fstream对象作为函数参数传递相关问题说明