void ,NULL與0的區別聯繫

void ,NULL0的區別聯繫

void的詳解:函數

void的字面意思是「無類型」或「空類型」,void*則爲「無針型指針」,那就意味着void*能夠指向任何類型的數據。spa

衆所周知,若是指針p1p2的類型相同,那麼咱們能夠直接在p1p2間互相賦值,不會出現問題;但若是p1p2指向不一樣的數據類指針

型,則必須使用強制類型轉換調試

運算符把賦值符號兩邊的類型轉換爲相同類型或兼容的類型,即就是把賦值運算符右邊的指針類型轉換爲左邊指針的類型。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

NULLC語言的stdio.h頭文件裏面的定義爲:

#if!defined(NULL) && defined(__NEEDS_NULL)
#ifdef__cplusplus
#defineNULL 0
#else
#defineNULL ((void *)0)
#endif
#endif

因而可知C語言中,NULL0的值能夠說是同樣的,但是爲了避免同目的和用途及容易識別的緣由,NULL用於指針和對象中0

於數值

對於字符串的結尾,使用'\0',它的值也是0可是讓人一看就知道這是字符串的結尾,不是指針,也不是普通的數值在不一樣的系統

中,NULL並不是老是和0

同,NULL僅僅表明空值,也就是指向一個不被使用的地址,在大多數系統中,都將0做爲不被使用的地址,因此就有了相似這樣的

定義

#defineNULL 0

但並不是老是如此,也有些系統不將0地址做爲NULL,而是用其餘的地址。

相關文章
相關標籤/搜索