int *p=NULL 和 *p=NULL有什么區別


  很多初學者搜無法分清這兩者之間的區別。先看下面的代碼:

int *p = NULL;

  這時候我們可以通過調試器查看p的值為0x00000000。這句代碼的意思是:定義一個指針變量p,其指向的內存里面保存的是int類型的數據;在定義變量p的同時,把p的值設置為0x00000000,而不是把*p的值設置為0x00000000。這個過程叫做初始化,是在編譯的時候進行的。

  

  明白了什么是初始化之后,再看下面的代碼:

int *p;
*p = NULL;

  同樣,我們可以在調試器上調試這兩行代碼。第1行代碼,定義了一個指針變量p,其指向的內存里保存的是int類型的數據;但是這時候變量p本身的值是多少不得而知,也就是說在變量p保存的有可能是一個非法的地址。第2行代碼,給*p賦值為NULL,即給p指向的內存賦值為NULL;但是由於p指向的內存可能是非法的,所以調試的時候調試器可能會報告一個內存訪問錯誤。這樣的話,我們可以把上面的代碼進行改寫,使p指向一塊合法的內存:

1 int i = 10;
2 int *p = &i;
3 *p = NULL;

  在調試上調試一下就會發現p指向的內存由原來的10變為了0;而p本身的值,即內存地址並沒有改變。

  

  經過上面的分析,相信你已經明白了它們之間的區別了。不過這里還有一個問題需要注意,就是這個NULL,初學者往往在這里犯錯誤。

  注意NULL就是NULL,它被宏定義為0:

#define  NULL  0

  很多系統除了有NULL外,還有NUL(Visual C++ 6.0 上提示說不認識NUL)。NUL是ASCII碼表的第1個字符,表示的是空字符,其ASCII碼值為0;其值雖然都為0,但表示的意思完全不一樣。同樣,NULL和0表示的意思也完全不一樣。一定不要混淆。

  

  另外有的初學者在使用NULL的時候誤寫成null或Null等,這些都是不正確的,C語言對大小寫可是十分敏感的。當然,也確實有系統定義了null,其意思也與NULL沒有區別,但是你千萬不要使用null,因為這會影響代碼的移植性。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM