关于 c++ 函数中指针赋值的简单问题
A simple question about pointer assignment in c++ function
这是我的代码,在函数中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
,例如int
或int*
,并且相同的规则将起作用。您可以使用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。
相关文章:
- 关于简单C++函数(is_palindrome)的逻辑的问题
- 退出简单while循环时出现问题
- 关于 c++ 函数中指针赋值的简单问题
- reinterpret_cast,只读访问,简单的可复制类型,会出什么问题?
- Opengl问题:很可能是简单的纹理问题
- 简单的问题 - 如何从单独的"结构"内的'class'访问变量?
- 运行简单的.oct文件时Octave崩溃,我的代码出了什么问题?
- 开发简单的时钟和日期类时遇到问题
- macos GCC 工具链编译简单 hello 世界的问题
- 具有 std:out_of_range 问题的简单密码 (C++)
- Qt的新信号/时隙语法问题 - 连接到一个简单的函数
- 这个简单的 C++ 递归函数来反转字符串有什么问题?
- 创建一个简单的计算器,添加时遇到问题
- (C++)关于结构和函数参数的简单问题
- OpenGL/GLUT让骑行变得平稳的简单问题
- 关于 cin/cout 过载的简单问题 4.
- 关于c++中基本指针使用和c++内存模型的几个简单问题
- 关于c++头文件的简单问题
- C字符串:简单问题
- 关于 valarray 的简单 c++ 问题