[英]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指針,我想指向位置0
( NULL
)。這就是全部。
現在,如果您嘗試讀取或寫入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.