1. int *p = NULL; 代表定義一個指向整型變量的指針p,然后p的值設為NULL,也就是設為0;用另一種方式說,就是對一個剛定義的指向整型變量的指針,賦初始值,讓其指向0地址。
2. *p = NULL; 代表對一個由指針p指向的變量(什么類型,不知道),賦值為0,是將那個變量賦值為0。
我們可以先看下面的代碼:
int *p = NULL;
這時候我們可以通過編譯器查看p的值為0x00000000。
這句代碼的意思是:定義一個指針變量p,其指向的內存里面保存的是int類型的數據;在定義變量p的同時把p的值設置為0x00000000,而不是把*p的值設置為0x00000000。這個過程叫做初始化,是在編譯的時候進行的。就好比我們定義了一個int型的變量,但是沒有賦初值,那么編譯器會自動賦初值為0,同理對於指針,就賦初值為0地址。
明白了什么是初始化之后,再看下面的代碼:
int *p; *p = NULL;
同樣,我們可以在編譯器上調試這兩行代碼。第一行代碼,定義了一個指針變量p,其指向的內存里面保存的是int類型的數據;但是這時候變量p本身的值是多少不得而知,也就是說現在變量p保存的有可能是一個非法的地址。第二行代碼,給*p賦值為NULL,即給p指向的內存賦值為NULL;但是由於p指向的內存可能是非法的,所以調試的時候編譯器可能會報告一個內存訪問錯誤。這樣的話,我們可以把上面的代碼改寫改寫,使p指向一塊合法的內存:
int i = 10; int *p = &i; *p = NULL;
在編譯器上調試一下,我們發現p指向的內存由原來的10變為0了;而p本身的值, 即內存地址並沒有改變。經過上面的分析,相信你已經明白它們之間的區別了。不過這里還有一個問題需要注意,也就是這個NULL。
初學者往往在這里犯錯誤。
注意NULL就是NULL,它被宏定義為0:
#define NULL 0
