[英]A simple question about pointer assignment in c++ function
這是我的代碼,在a = b;
之后在 function 中,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;
}
如果你真的想改變 a 指向的東西,那么你可以這樣想,也許它會有助於讓它更容易理解。 A 是一個 int 指針,function 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 的新指針值。
假設有某種類型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
進行嘗試,並查看每個版本的效果,這應該有助於您了解發生了什么。 請注意,您使用的是第一個版本(按值傳遞),但對於您期望的結果,您應該使用第二個版本(按引用傳遞)。
是的,當然,為什么改變getBox
中的a
會改變 main 中的a
的值? 如果您認為答案是“因為它是指針”,那么恐怕您誤解了指針。
看看這段代碼
int getBox(int a){
a=3;
std::cout<<a;
}
int main(){
int a= 0;
getBox(a);
std::cout<<a;
}
在getBox
中設置a=3
對 main 中a
沒有影響。 您的代碼完全相同,但由於某種原因,由於涉及指針,初學者通常認為它的工作方式不同。 它沒有。
但是,您可以通過這種方式使用指針來更改所指向的內容,這很重要,但是更改指針本身並不能以您期望的方式工作。
您可能只想更改為getBox(int * & a)
。 然后,您將對指針a
的引用傳遞給 function,而不是在您的案例 NULL 中創建指向相同地址的指針副本。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.