在c語言中,存在各種各樣的「零」。例如:0,『0』,null等。下面我們就具體介紹一下這些」零「:
零值意義備註0
整型資料的0
0.0實型資料的0
null
指標型資料的0
記憶體的0位址,用於初始化暫時不用的指標。或是標識已經被釋放堆記憶體的指標。
『\0』
轉義字元型(ascii值為0)
非可列印字元,用於標識字串結束標記。
『0』字元型(ascii值為48)
可列印字元,用於列印字元0
「0」字串型
包含兩個ascii值40和0
在上述這些零中,其他的都好理解。令人困惑的恐怕就是0與null的關係了吧!下面,我們就主要來介紹以下這兩個令人迷惑的東西。
首先我們先用一段c**來測試兩者之間的關係:
#include int main()
在linux下,使用gdb單步除錯,結果如下:
可以看出:在c語言中,null和0的值都是一樣的,但是為了目的和用途及容易識別的原因,null用於指標和物件,0用於數值。
注意:在不同的系統中,null並非總是和0等同,null僅僅代表空值,也就是指向乙個不被使用的位址,在大多數系統中,都將0作為不被使用的位址,所以就有了類似這樣的巨集定義:#define null 0;
null在stdio.h中定義:
#if !defined(null) && defined(__needs_null)
#ifdef __cplusplus
#define null 0
#else
#define null ((void *)0)
#endif
#endif
從上述**中可以看出:在c++中將null定義為0,而在c語言中,卻將null定義為(void *)0。.這是為什麼呢?
答:在c中,null擴充套件為乙個實現定義的「空指標常量」。空指標常量可以是值為0的整數常量表示式,也可以是乙個表示式void*。所以c實現可以定義null為0或者((void*)0)。
int* p = 0;
int* p= (void *)0;
在c語言中,這兩者都是合法的
在c ++中,空指標常量的規則是不同的。在c++中,空指標常量是整數型別的整數常量表示式右值,求值為零。在c ++中,int* p= (void* )0這是不合法的,因為不能隱式轉換void*為另一種指標型別。
int* p = 0; //合法
int* p = (void* )0; //不合法
由於這一點以及隨之而來的混淆,自從c ++ 11以來,有乙個關鍵字nullptr代表乙個空指標:
int* p = nullptr;
這樣的話就會清晰很多。例如,假設存在兩個不同功能:
int test(int x);
int test(int* x);
當我們想使用第二個功能時,若使用null,即:test(null)相當於test(0),此時就會呼叫第乙個功能,和我們的需求相反,但是,使用nullptr時,即:test(nullptr);它會呼叫test(int*)按預期呼叫函式。 C語言中的各種進製轉換
一 正數 1.十 二 2.二 十 3.十 八 4.八 十 6.十六 十 二 負數 正文 一 正數 在高速發展的現代社會,計算機浩浩蕩蕩地成為了人們生活中不可缺少的一部分,幫助人們解決通訊,聯絡,互動等各方面的問題。今天我就給大家講講與計算機有關的 進製轉換 問題。我們以 25.625 十 為例講解一...
C語言中各種printf輸出型別
d整型輸出,ld長整型輸出,o以八進位制數形式輸出整數,x以十六進製制數形式輸出整數,u以十進位制數輸出unsigned型資料 無符號數 c用來輸出乙個字元,s用來輸出乙個字串,f用來輸出實數,以小數形式輸出,備註 浮點數是不能定義如的精度的,所以 6.2f 這種寫法是 錯誤的 e以指數形式輸出實數...
C語言中各種資料型別的大小
c語言 1.幾條規則 1 char型別一般是8bit,但ansi c裡沒有硬性規定其長度,某些嵌入式編譯器可能是16bit 2 short和long型別的長度不相同 3 int型別通常同具體機器的物理字長相同 4 short通常是16bits,int通常是16bits or 32bits每種編譯器可...