2011-01-13 232 views

回答

10

int* a將變量a聲明爲指向整數的指針。

=0=10爲變量賦值一些值。

請注意,a是一個指針,它的值應該是一個地址。

  • 地址0有特定的含義:它是NULL,表示指針。

  • 地址10沒有意義:它是一個隨機存儲器地址。由於它不是NULL,因此大多數函數都會將其視爲有效地址,並對其進行解引用,因此會給應用程序帶來問題(未定義的行爲)。

+0

int * a和int * a都相同嗎? – 2011-01-13 11:29:37

+1

除非編譯器給出該地址特殊含義(「視頻內存緩衝區的地址」),否則定義`= 10`的行爲是未定義的行爲。你甚至不需要使用它。 – 2011-01-13 11:30:49

4
int* a = 0; 

將0賦給指針。

int* a = 10; 

將10指定給指針。請注意,指針(即應包含地址的變量)不是指針!

最後一個是危險的,因爲它擊敗NULL指針檢查。

1

這裏我們給指針賦值,int * a = 0;意思是int a * = NULL;然而,在C++中,int * a = 10不會編譯,因爲「從整型到指針類型的轉換需要reinterpret_cast,C型轉換或函數式轉換」,因爲編譯器認爲10是整型而不是指針。

+0

這是一個很好的答案,但OP沒有提到C++。 +1,如果你拿出C++特定的術語。如果沒有人試圖用黑暗的一面來誘惑你,C足夠讓人迷惑。 :P – 2011-01-13 11:30:20

5

其中一個應該會觸發警告。打開你的編譯器警告!

int *a = 0; 

這一個是好的。它將指針a指定爲int並將其初始化爲0或指針NULL,這意味着它指向任何內容。嘗試對其進行解引用會導致不好的事情,但是在取消引用前可以檢查指針是否有效,所以指針實際上是好東西。

int *a = 10; 

這並不好。它聲明瞭與int相同的指針,但將其初始化爲10.首先,編譯器會抱怨不能將其隱式轉換爲指針類型。如果你忽略這一點,指針指向的內存位置10,你有不保證是一個有效的int或有效的任何東西,甚至屬於你的過程。提取a會很糟糕,就像提取a的時候是NULL,但更糟的是,我們無法檢查a的有效性,因爲10可能很好不好 - 我們無法知道,直到我們使用它,得到我們想要的/垃圾/鼻子惡魔。

4

首先,這些不是表達式,它們是聲明。

int* a = 0; 

聲明一個指針到整數和具有零編譯時整數常數,它被轉換成一個空指針值進行初始化。換句話說,它聲明瞭一個指向整數的空指針。

int* a = 10; 

聲明一個指針到整數指向任何特定編譯器定義是在由整數10表示。在絕大多數情況下的地址,有什麼都沒有,所以你最終未定義的行爲僅僅是通過聲明這個指針。

相關問題