回答
int* a
將變量a
聲明爲指向整數的指針。
=0
和=10
爲變量賦值一些值。
請注意,a
是一個指針,它的值應該是一個地址。
地址
0
有特定的含義:它是NULL
,表示空指針。地址
10
沒有意義:它是一個隨機存儲器地址。由於它不是NULL
,因此大多數函數都會將其視爲有效地址,並對其進行解引用,因此會給應用程序帶來問題(未定義的行爲)。
int* a = 0;
將0賦給指針。
int* a = 10;
將10指定給指針。請注意,指針(即應包含地址的變量)不是指針!
最後一個是危險的,因爲它擊敗NULL
指針檢查。
這裏我們給指針賦值,int * a = 0;意思是int a * = NULL;然而,在C++中,int * a = 10不會編譯,因爲「從整型到指針類型的轉換需要reinterpret_cast,C型轉換或函數式轉換」,因爲編譯器認爲10是整型而不是指針。
這是一個很好的答案,但OP沒有提到C++。 +1,如果你拿出C++特定的術語。如果沒有人試圖用黑暗的一面來誘惑你,C足夠讓人迷惑。 :P – 2011-01-13 11:30:20
其中一個應該會觸發警告。打開你的編譯器警告!
int *a = 0;
這一個是好的。它將指針a
指定爲int
並將其初始化爲0或指針NULL
,這意味着它指向任何內容。嘗試對其進行解引用會導致不好的事情,但是在取消引用前可以檢查指針是否有效,所以指針實際上是好東西。
int *a = 10;
這並不好。它聲明瞭與int
相同的指針,但將其初始化爲10.首先,編譯器會抱怨不能將其隱式轉換爲指針類型。如果你忽略這一點,指針指向的內存位置10,你有不保證是一個有效的int
或有效的任何東西,甚至屬於你的過程。提取a
會很糟糕,就像提取a
的時候是NULL
,但更糟的是,我們無法檢查a
的有效性,因爲10可能很好或不好 - 我們無法知道,直到我們使用它,得到我們想要的/垃圾/鼻子惡魔。
首先,這些不是表達式,它們是聲明。
int* a = 0;
聲明一個指針到整數和具有零編譯時整數常數,它被轉換成一個空指針值進行初始化。換句話說,它聲明瞭一個指向整數的空指針。
int* a = 10;
聲明一個指針到整數指向任何特定編譯器定義是在由整數10表示。在絕大多數情況下的地址,有什麼都沒有,所以你最終未定義的行爲僅僅是通過聲明這個指針。
- 1. Java中的int a [5],int a [],int a [] = {2,3}之間的區別
- 2. '(int)a','a as int'和C#中的Convert.ToInt32(a)之間的區別
- 3. extern int a之間的區別; extern int a = 42;
- 4. double a = a + int b和int a + = double b之間的區別是什麼?
- 5. a // b和int(a/b)之間有什麼區別?
- 6. swap(int&a,int&b)和swap(int * a,int * b)。有什麼區別?
- 7. java中a + = 10和a = a + 10之間的區別?
- 8. 正則表達式[A-Z]和[a-zA-Z]之間的區別
- 9. int * p =&a ++和int * p =&++ a
- 10. PHP中的$ a = 0和$ a ='0'之間的區別
- 11. static int a和int a有什麼區別?
- 12. 「int N = a == b?a:a + b == 10?a + b:0;」的含義
- 13. int * ptr =(int *)(&a + 1);
- 14. C塊變爲表達式:({int a = 1; int b = 2; a + b;})等於3
- 15. 正則表達式,^ [a-zA-Z] + $ vs [a-zA-Z]之間的區別*
- 16. 正則表達式:^和\ A之間的區別
- 17. A * pA = new A之間的區別;和A * pA = new A();
- 18. a + = b和a = + b之間的區別是什麼,a ++和++ a?
- 19. 函數參數的區別在C++中爲(const int&)和(int&a)
- 20. int p = *(int *)i和int p = *(int *)&i之間的區別
- 21. 字符串中的[0]和&a [0]之間的區別
- 22. Python 3.5 - '//'和'int()'之間的區別
- 23. 正則表達式中的「a {1}」和「a」有什麼區別?
- 24. 這個程序中的&a [0]和a之間的區別是什麼?
- 25. C#中char和int之間的區別#
- 26. ||之間的區別a = b和a = a || b在紅寶石?
- 27. ES6對象方法分配之間的區別:a,'a'和['a']?
- 28. C++中新int()和新int {}之間的區別
- 29. public void add(int a,int ... b){
- 30. int someInts [3]和int * someInts = new int [3]之間的區別?
int * a和int * a都相同嗎? – 2011-01-13 11:29:37
除非編譯器給出該地址特殊含義(「視頻內存緩衝區的地址」),否則定義`= 10`的行爲是未定義的行爲。你甚至不需要使用它。 – 2011-01-13 11:30:49