我有一个代码:
void fun1(int ** i) {
*i = new int(0);
}
void fun2(int *& i) {
i = new int(69);
}
int main()
{
using namespace std;
int a = new int(42);
fun1(&a);
cout << "fun1" << a << endl;
fun2(&a);
cout << "fun2" << a << endl;
}
我想通过&#34; a&#34;到函数fun1和fun2。我可以在不创建指向指针的指针的情况下执行此操作吗?我可以通过&#34; a&#34;不知何故?
答案 0 :(得分:2)
其中一个函数采用指向指针的指针:
void fun1(int ** i)
另一个接受指针的引用:
void fun1(int *& i)
在没有指针变量的情况下调用它们是没有意义的,因为这些函数的主要效果(最有可能)是更改地址传递的指针(通过引用传递,作为指针或引用)指向它以便它可以是由来电者使用。
让我们假设以下内容可行
int a;
fun1(&(&a));
该功能会改变地址&#34;临时&#34; (&a
是指向int的指针),但你无法访问它。
答案 1 :(得分:1)
所有int a = new int(42);
中的第1个错误,操作符new
在堆上创建对象并返回指向新创建的对象的指针。您正尝试将其分配给int
。最好它应该看起来像int* a = new int; *a = 42;
,那时你的代码负责删除它
现在,如果你有一个像func(int* pA) {}
这样的函数,并且有一个像int a = 42;
这样的局部变量,并且想要将它传递给你的函数,你可以将你的函数称为func(&a);
。
第二,你的功能都在造成内存泄漏。您正在创建一个永不删除的新指针
如果你想改变你的函数中a的值,你需要的就是这样:
void func1(int* pA)
{
*pA = 42;
}
或者您可以这样做:
void func2(int& rA)
{
rA = 42;
}
我认为你还没有理解指针和引用的含义。
答案 2 :(得分:0)
要获得没有指针的引用,只需执行foo(int &a) {a = 43}
并调用此函数:foo(a)
答案 3 :(得分:0)
运算符new返回指针,因此您必须编写int* a = new int(42);
。您可以按如下方式调用函数:
fun1(&a);
fun2(a);
并且不要忘记用新的删除已分配的内存:
#include <iostream>
void fun1(int ** i)
{
delete *i;
*i = new int(0);
}
void fun2(int *& i)
{
delete i;
i = new int(69);
}
int main()
{
using namespace std;
int *a = new int(42);
fun1(&a);
cout << "fun1: " << a << endl;
fun2(a);
cout << "fun2: " << a << endl;
delete a;
}