void ,NULL与0的区别联系
void ,NULL及0的區(qū)別聯(lián)系
void的詳解:
void的字面意思是“無(wú)類型”或“空類型”,void*則為“無(wú)針型指針”,那就意味著void*可以指向任何類型的數(shù)據(jù)。
眾所周知,如果指針p1和p2的類型相同,那么我們可以直接在p1和p2間互相賦值,不會(huì)出現(xiàn)問(wèn)題;但如果p1和p2指向不同的數(shù)據(jù)類
型,則必須使用強(qiáng)制類型轉(zhuǎn)換
運(yùn)算符把賦值符號(hào)兩邊的類型轉(zhuǎn)換為相同類型或兼容的類型,即就是把賦值運(yùn)算符右邊的指針類型轉(zhuǎn)換為左邊指針的類型。
例如:
float *p1; int *p2; p1 = p2;其中p1= p2語(yǔ)句會(huì)編譯出現(xiàn)警告
In function ‘main’:
15:7: warning:assignment from incompatible pointer type [enabled by default]
提示我們第十五行的賦值類型不兼容
而改成p1= (float *)p2;才正確;
而void*則不同,任何類型的指針都可以直接賦值給它,無(wú)需進(jìn)行強(qiáng)制類型轉(zhuǎn)換:
void*p1; int *p2; p1 = p2;但這并不意味著,void*也可以無(wú)需強(qiáng)制類型轉(zhuǎn)換地賦給其它類型的指針。因?yàn)椤盁o(wú)類型”可以包容“有類型”,而“有類型”則不能包容“無(wú)類型”。道理很簡(jiǎn)
單,我們可以說(shuō)“男人和女人都是人”,但不能說(shuō)“人是男人”或者“人是女人”。
下面的語(yǔ)句編譯出錯(cuò)或警告:
void *p1; int *p2; p2 = p1;在C語(yǔ)言中,凡不加返回值類型限定的函數(shù),就會(huì)被編譯器作為返回整型值處理。但是許多人卻誤以為其為void類型。例如:
程序運(yùn)行的結(jié)果為輸出:
2 + 3 = 5
這說(shuō)明不加返回值說(shuō)明的函數(shù)的確為int函數(shù)。
NULL詳解:
運(yùn)行:
#include<stdo.h> int main() { int *p=NULL; printf("%s",p); }輸出:(null)
gdb調(diào)試可以看出執(zhí)行int*p=NULL,p的值為0x00000000,可以看出,NULL在實(shí)際底層調(diào)用中就是0。
而NULL在C語(yǔ)言的stdio.h頭文件里面的定義為:
#if!defined(NULL) && defined(__NEEDS_NULL) #ifdef__cplusplus #defineNULL 0 #else #defineNULL ((void *)0) #endif #endif由此可見(jiàn),在C語(yǔ)言中,NULL和0的值可以說(shuō)是一樣的,但是為了不同目的和用途及容易識(shí)別的原因,NULL用于指針和對(duì)象中,0用
于數(shù)值
對(duì)于字符串的結(jié)尾,使用'\0',它的值也是0,但是讓人一看就知道這是字符串的結(jié)尾,不是指針,也不是普通的數(shù)值。在不同的系統(tǒng)
中,NULL并非總是和0等
同,NULL僅僅代表空值,也就是指向一個(gè)不被使用的地址,在大多數(shù)系統(tǒng)中,都將0作為不被使用的地址,所以就有了類似這樣的
定義
#defineNULL 0但并非總是如此,也有些系統(tǒng)不將0地址作為NULL,而是用其他的地址。
轉(zhuǎn)載于:https://www.cnblogs.com/csdndreamer/p/5490656.html
總結(jié)
以上是生活随笔為你收集整理的void ,NULL与0的区别联系的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: jmeter学习笔记(一)
- 下一篇: 修复 Xcode 错误 “The ide