void的詳解:函數
void的字面意思是「無類型」或「空類型」,void*則爲「無針型指針」,那就意味着void*能夠指向任何類型的數據。spa
衆所周知,若是指針p1和p2的類型相同,那麼咱們能夠直接在p1和p2間互相賦值,不會出現問題;但若是p1和p2指向不一樣的數據類指針
型,則必須使用強制類型轉換調試
運算符把賦值符號兩邊的類型轉換爲相同類型或兼容的類型,即就是把賦值運算符右邊的指針類型轉換爲左邊指針的類型。code
例如:orm
float *p1; int *p2; p1 = p2;
其中p1= p2語句會編譯出現警告對象
In function ‘main’:字符串
15:7: warning:assignment from incompatible pointer type [enabled by default]編譯器
提示咱們第十五行的賦值類型不兼容io
而改爲p1= (float *)p2;才正確;
而void*則不一樣,任何類型的指針均可以直接賦值給它,無需進行強制類型轉換:
void*p1; int *p2; p1 = p2;但這並不意味着, void* 也能夠無需強制類型轉換地賦給其它類型的指針。由於「無類型」能夠包容「有類型」,而「有類型」則不能包容「無類型」。道理很簡
單,咱們能夠說「男人和女人都是人」,但不能說「人是男人」或者「人是女人」。
下面的語句編譯出錯或警告:
void *p1; int *p2; p2 = p1;
在C語言中,凡不加返回值類型限定的函數,就會被編譯器做爲返回整型值處理。可是許多人卻誤覺得其爲void類型。例如:
add ( int a, int b ) { return a + b; } int main(int argc,char* argv[]) { printf ( "2 + 3= %d", add ( 2, 3) ); }
程序運行的結果爲輸出:
2 + 3 = 5
這說明不加返回值說明的函數的確爲int函數。
NULL詳解:
運行:
#include<stdo.h> int main() { int *p=NULL; printf("%s",p); }
輸出:(null)
gdb調試能夠看出執行int*p=NULL,p的值爲0x00000000,能夠看出,NULL在實際底層調用中就是0。
而NULL在C語言的stdio.h頭文件裏面的定義爲:
#if!defined(NULL) && defined(__NEEDS_NULL) #ifdef__cplusplus #defineNULL 0 #else #defineNULL ((void *)0) #endif #endif
因而可知,在C語言中,NULL和0的值能夠說是同樣的,但是爲了避免同目的和用途及容易識別的緣由,NULL用於指針和對象中,0用
於數值
對於字符串的結尾,使用'\0',它的值也是0,可是讓人一看就知道這是字符串的結尾,不是指針,也不是普通的數值。在不一樣的系統
中,NULL並不是老是和0等
同,NULL僅僅表明空值,也就是指向一個不被使用的地址,在大多數系統中,都將0做爲不被使用的地址,因此就有了相似這樣的
定義
#defineNULL 0
但並不是老是如此,也有些系統不將0地址做爲NULL,而是用其餘的地址。