0在c/c++語言中有4中形態:
整形0,空指標null,字串結束標記『\0』,和邏輯false/false。
這四種都是有差異的。
它們所佔的記憶體空間:
整形的0佔32位的空間,指標和整形所佔的空間是一樣的。
字元佔空間8位,而邏輯符不太一樣,false是int型別,佔32位,而false是bool型別,佔1位。
#ifndef null
#ifdef _cplusplus
#define null 0
#else
#define null ((void *)0)
#endif
#endif
在c語言中,null被強制轉化了一次。
可以看出,在c中,null表示的是指向0的指標,而在c++中,null就直接跟0一樣了。
但有一點值得注意的是:在c語言中,「 當常量0處於應該作為指標使用的上下文中時,它就作為空指標使用 」
int * p=3;
int * p=0;
第一句**就會出錯,而第二句**則不會,說明0在這裡的角色已經不是整形了。
另外
char a[4]=;
//warning: converting to non-pointer type 'char' from null [-wconversion-null]|
這句**會給出警告,這裡的null和』\0』是不一樣的,這是codeblocks環境下的,在別的環境下可能會報錯。
邏輯false的定義和false是不一樣的。
#ifndef false
#define false 0
#endif
#ifndef true
#define true 1
#endif
這裡可以發現,false/true是int型別,而我們用的false/true是bool型別。
這兩個也是有區別的。
其二進位制表示如下:
false -> 0
false -> 00000000 00000000 00000000 00000000
//如果不夠細心,0的多重性可能會讓程式產生一些難以發現的bug,比如:
// 把psrc 指向的源字串複製到pdes 指向的記憶體塊
while(psrc)
//正常情況下,當psrc指向的字元為字串結束符'\0'時,while迴圈終止;但不幸的是,這裡的條件寫錯了,while終止條件變成了psrc指向位址0。結果while迴圈寫入到記憶體中了,直至程式崩潰。
//正確的寫法應該是:
// 把psrc 指向的源字串複製到pdes 指向的記憶體塊中
while(*psrc)
我覺得這個應該是指標問題,不應該歸結於0的誤用。這裡需要指向位址0才會停止迴圈。
//#include
#include
using
namespace
std;
int main()
大家可以看這一段**,不同的0的形態都是不一樣的,指標型別和整形的空間是一樣的。 建議1 區分4中零值
0在c c 語言中絕對是乙個多面手,它扮演著多樣的角色,擁有著多種面孔。總結起來包括以下幾種角色 整型0 空指標null 字串結束標誌 0 邏輯false false,不同的角色適用於不同的情形,下面我們按照上述順序一一介紹。整型0這是我們最熟悉的乙個角色。作為乙個int型別,整型0佔據32位的空間...
ext4分割槽中恢復被刪除的檔案
今天在測試我剛完成的在linux對ntfs分割槽進行備份和恢復的 執行程式備份乙個200m的ntfs分割槽,然後在執行另乙個程式恢復資料到這個200m的分割槽中,然後把這個分割槽載入到 tmp sdd1中檢視,檔案恢復成功 欣喜啊,做了幾個星期,終於可以舒一口氣了!因此,想進一步測試一下,所以想把 ...
ext4分割槽中恢復被刪除的檔案
今天在測試我剛完成的在linux對ntfs分割槽進行備份和恢復的 執行程式備份乙個200m的ntfs分割槽,然後在執行另乙個程式恢復資料到這個200m的分割槽中,然後把這個分割槽載入到 tmp sdd1中檢視,檔案恢復成功 欣喜啊,做了幾個星期,終於可以舒一口氣了!因此,想進一步測試一下,所以想把 ...