关于 c++ 函数中指针赋值的简单问题

A simple question about pointer assignment in c++ function

本文关键字:简单 问题 赋值 指针 c++ 函数 关于      更新时间:2023-10-16

这是我的代码,在函数中a = b;后,a仍然nullptr....

int getBox(int *a) {
int *b = new int;
*b = 3;
a = b;
std::cout << *a;
}
int main() {
int *a = nullptr;
getBox(a);
std::cout << a;
}

我想这是一个非常简单的问题...也许我忘记了太多关于C++

我不确定你想做什么,但getBox()里面的这一行:

a=&b;

实际上并没有改变主要的a,你实际上覆盖了指针(函数所做的副本(,并使其指向其他地方。

你可以做这样的事情(再次,我不明白这一点(:

int getBox(int ** a){
int *b = new int;
*b=3;
*a=b;
std::cout<<*a;
}
int main(){
int *a= nullptr;
getBox(&a);
std::cout<<a;
}

假设存在某种类型T。现在这里有 3 种不同类型的函数:

void f(T a) {  // pass by value (this is a copy of the 'a' in main)
a = /* something else */ ;
}
int main() {
T a = /* something */ ;
f(a);
// a is still something
}
void f(T &a) {  // pass by reference (this is a reference to the 'a' in main)
a = /* something else */ ;
}
int main() {
T a = /* something */ ;
f(a);
// a is now something else
}
void f(T *a) {  // pass by address (this is a pointer to the address the 'a' in main)
*a = /* something else */ ;
}
int main() {
T a = /* something */ ;
f(&a);
// a is now something else
}

现在,您可以将此逻辑应用于所需的任何T,例如intint*,并且相同的规则将起作用。您可以使用getBox尝试此操作并查看每个版本的效果,这应该可以帮助您了解正在发生的事情。请注意,您使用的是第一个版本(按值传递(,但对于预期的结果,应使用第二个版本(按引用传递(。

如果你真的想改变a所指向的内容,那么你可以这样想,也许它将有助于让它更容易理解。 A 是一个 int 指针,函数 getBox 接受一个引用,您可以修改其值,这是一个 int 指针。

void getBox(int* &a) {
int *b = new int;
*b = 3;
a = b;
std::cout << *a;
}
int main(){
int *a= nullptr;
getBox(a);
std::cout<< *a;
}

这将更改 a 的值,这是指向 b 的新指针值。

是的,当然,为什么要更改a中的getBox更改 main 中a的值?如果你认为答案是"因为它是一个指针",那么恐怕你误解了指针。

看看这个代码

int getBox(int a){
a=3;
std::cout<<a;
}
int main(){
int a= 0;
getBox(a);
std::cout<<a;
}

getBox中设置a=3对主a没有影响。您的代码完全相同,但由于某种原因,由于涉及指针,初学者通常认为它的工作方式不同。其实不然。

但是,您可以以这种方式使用指针来更改所指向的内容,这很重要,但是更改指针本身不会以您期望的方式工作。

您可能只想更改为getBox(int * & a)。然后,将对指针的引用传递到函数a,而不是创建指向相同地址的指针副本,在这种情况下为 NULL。