簡體   English   中英

C ++中的空指針聲明混亂

[英]Null pointers declaration confusion in C++

我開始學習C ++。 我對指針(特別是NULL指針)感到困惑。 據我了解,當您聲明一個指針並將其設置為指向一個值時,您可以執行以下操作:

    int var = 10;
    int *ptr;
    ptr = &var;
    *ptr = 20;

這會將var的值更改為20。但是,當您設置NULL指針時,請執行以下操作:

int *ptr = NULL;

難道不是因為*運算符而將NULL值分配給指向ptr而不是地址的變量? 我以為NULL指針的值(其地址)為0,因此從我讀取的內容來看,它沒有指向任何地方。 這樣做是否更有意義:

int *ptr;
ptr = NULL // or 0?

對於外行術語的解釋將不勝感激,我在編碼和研究過程中仍在學習所有術語,所以我希望對您使用的任何編程術語進行解釋。

通過說int *ptr = NULL; 您正在說“我正在聲明一個稱為ptr的int指針,我想指向位置0NULL )。這就是全部。

現在,如果您嘗試讀取或寫入ptr ,則會得到未定義的行為 ,通常這是一個可怕的地方(比得到錯誤更糟糕,因為程序可能在其他地方開始出現問題,並且您不知道為什么) 。 但是通常,當您要表示不應該使用NULL指針並且必須對其進行初始化時,將使用NULL指針。

正如David Schwartz所說,

如果您使用int* ptr而不是int *ptr會更容易理解。

這是因為ptr的類型實際上是int* ,它是指向整數的指針。 聲明類型時, *表示指針。 僅當在*ptr = 20表達式中使用指針時, *表示“取消引用”。

借助C ++ 11別名模板,您可以用常規模板語法替換奇怪的T*語法:

template<typename T> using pointer = T*;

pointer<int> ptr = nullptr;

int *ptr = NULL;

* 不是 *運算符。 *字符只是指針聲明符語法的一部分。 它與*運算符無關。

在表達式中使用運算符。 上面的*ptr是聲明中的聲明符。 聲明符不是表達式。 即使某些字符看起來像“運算符”,該聲明符中也沒有運算符。

沒有。 在隨處可見帶有ptr*運算符的地方,都意味着第一次取消引用。 當你做

int *ptr = 0;

*使ptr成為整數指針,並將其指向空地址,即內存中的“第零”位置

在現代C ++中,更好的用法是

int *ptr = nullptr;

這意味着您的ptr在內存中沒有位置可依。

nullptr的類型為nullptr_t ,它不是整數或任何其他類型。 相反,它更安全,具體取決於宏NULL。 由於如果將NULL定義為0 ,則可以將其轉換為整數,並且在處理函數參數和其他情況時會產生問題。

用最簡單的話來說:

int *ptr = NULL; 

意味着有一個名為ptr的指針被分配了等於NULL,這意味着現在它沒有指向任何地方(沒有任何垃圾值或其他任何東西),它的值為NULL!

暫無
暫無

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

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