c語言中 int *p = NULL 和 *p = NULL 有什么區別


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

  




免責聲明!

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



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