簡體   English   中英

關於c++ function中指針賦值的一個簡單問題

[英]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 ,例如intint* ,並且相同的規則將起作用。 您可以使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM