簡體   English   中英

在C ++中傳遞/檢索指針

[英]Passing/Retrieving pointers in C++

在C ++中通過指針傳遞或檢索對象時,已知對象本身不會被復制,但是指針如何處理,接收函數也會處理該對象的相同指針或該指針的副本,從而處理每個指針當不再需要時,應將其分配為null。

當在c ++中傳遞指針時(即foo(some_object* p) ),您實際上傳遞的是對象所在的指針的值。 該值本身是一個副本,這意味着如果您執行p = NULL; 在函數內部,它不會更改原始指針,但是它指向的地址包含相同的原始對象。

例:

#include <iostream>
using namespace std;

class obj{
public:
  int a;
};

void foo(obj* pp){
    pp->a = 2;
    pp = NULL;
    cout << pp << endl;
}
int main() {
    obj* p = new obj();
    p->a = 1;
    cout << p << '\t' << p->a << endl;
    foo(p);
    cout << p << '\t' << p->a;
    return 0;
}

您會注意到,盡管在內部執行了更改,但p在執行foo之后仍保持不變,因為更改的是p的副本,而afoo期間實際上已更改

指針已被復制,但是由於該副本的值仍位於相同的內存位置,因此您仍然可以修改副本所指向的變量。

@CIsForCookies很好地解釋了...

添加一個小細節:

[...]或該指針的副本,因此在不再需要時應將每個指針分配為null嗎?

函數參數是函數本地的變量,就像在函數體內聲明的變量一樣。 這意味着一旦函數返回,它們的生命周期就會結束。

因此,在返回之前將任何指針設置為null都是徒勞的,因為之后,(復制的)指針根本不再存在了...

指針只是一個數字(如int變量),它指向存儲該變量的存儲單元(實際上指向它的開頭)。 如果將int變量傳遞給函數,則在使用后不必將其設置為0 ,編譯器將為您完成此操作。

同樣,如果您傳遞的變量沒有引用,則很有可能會使用一個臨時副本。

void test (VarType* ptr) {...}

您可以使用對指針的const引用,其行為類似於對變量的const引用:

void test (VarType* const& ptr) {...}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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