C语言空指针NULL详解
空指針NULL:
在C語(yǔ)言中,如果一個(gè)指針不指向任何數(shù)據(jù),我們就稱之為空指針,用NULL表示。例如:
int *p = NULL;NULL 是一個(gè)宏定義,在stdio.h被定義為:
#define NULL ((void *)0)那么我們來(lái)看看什么是空指針?
[6.3.2.3-3] If a null pointer constant is converted to a pointer type, the resulting pointer, called a null pointer, is guaranteed to compare unequal to a pointer to any object or function.
因此,如果 a 是一個(gè)指針變量,則 a = 0;、a = 0L;、a = '\0';、a = 3 - 3;、a = 0 * 17; 中的任何一種賦值操作之后(對(duì)于 C 來(lái)說(shuō)還可以是 p = (void*)0;), p 都成為一個(gè)空指針,由系統(tǒng)保證空指針不指向任何實(shí)際的對(duì)象或者函數(shù)。反過(guò)來(lái)說(shuō),任何對(duì)象或者函數(shù)的地址都不可能是空指針。(tyc: 比如這里的(void*)0就是一個(gè)空指針。把它理解為null pointer還是null pointer constant會(huì)有微秒的不同,當(dāng)然也不是緊要了
那么什么是NULL??
[6.3.2.3-Footnote] The macro NULL is defined in <stddef.h> (and other headers) as a null pointer constant
即 NULL 是一個(gè)標(biāo)準(zhǔn)規(guī)定的宏定義,用來(lái)表示空指針常量。因此可以用 a = NULL; 來(lái)使 a 成為一個(gè)空指針。(tyc:很多系統(tǒng)中的實(shí)現(xiàn):#define NULL (void*)0,與這里的“a null pointer constant”并不是完全一致的)。如果包含了相應(yīng)的標(biāo)準(zhǔn)頭文件而引入了 NULL 的話,則再在程序中重新定義 NULL 為不同的內(nèi)容是非法的,其行為是未定義的。也就是說(shuō),如果是符合標(biāo)準(zhǔn)的程序,其 NULL 的值只能是 0,不可能是除 0 之外的其它值,比如 1、2、3 等。
根據(jù)下面這行代碼我們來(lái)理解一下空指針NULL:
#include <stdio.h>int main() { int *a = NULL; printf("%d\n", a); return 0; } 運(yùn)行結(jié)果: 0根據(jù)宏定義我們知道:
(void *)0表示把數(shù)值 0 強(qiáng)制轉(zhuǎn)換為void *類型,最外層的( )把宏定義的內(nèi)容括起來(lái),我們自己進(jìn)行宏定義時(shí)也推薦這么做,防止發(fā)生歧義,所以最后運(yùn)行結(jié)果為0。
那么你現(xiàn)在是否會(huì)想NULL和0是等價(jià)的呢??
答案肯定是否定的,我們都知道變量定義系統(tǒng)就會(huì)給他分配內(nèi)存空間,指針變量也是如此,如果指針沒(méi)有指向的話那么地址就是隨機(jī)值。
例如:
int *p;//它不是空指針這個(gè)指針的地址是一個(gè)隨機(jī)值,如果不小心用的話就會(huì)導(dǎo)致數(shù)據(jù)錯(cuò)誤,從而使程序退出。
NULL 使 p 指向地址 0。大多數(shù)系統(tǒng)中都將 0 作為不被使用的地址,所以運(yùn)用 p 也不會(huì)毀壞數(shù)據(jù)。但并非總是如此,也有系統(tǒng)會(huì)使用地址 0,而將 NULL 定義為其他值,所以不要把 NULL 和 0 等同起來(lái)。
指針變量 p 是空指針的判斷:
if ( p == 0 )
if ( p == '\0' )
if ( p == NULL ) /* 使用 NULL 必須包含相應(yīng)的標(biāo)準(zhǔn)庫(kù)的頭文件 */stdio.h
if ( NULL == p )
if ( !p ) <---------------(這里和下面的if(p)都被專門說(shuō)過(guò)一次,null定義不一定是0.這里如果貿(mào)然使用!p會(huì)很危險(xiǎn)的.上面也專門解釋了這種寫(xiě)法的危險(xiǎn)性,所以這種寫(xiě)法不能被提倡)
指針變量 p 不是空指針的判斷:
if ( p != 0 )
if ( p != '\0' )
if ( p != NULL ) /* 使用 NULL 必須包含相應(yīng)的標(biāo)準(zhǔn)庫(kù)的頭文件 */stdio.h
if ( NULL != p )
if ( p != q )
如果大家對(duì)C語(yǔ)言感興趣,可以關(guān)注小編公眾號(hào)與小編一起學(xué)習(xí)C語(yǔ)言!!小編有干貨的話會(huì)免費(fèi)分享給大家的哦!!!
?
總結(jié)
以上是生活随笔為你收集整理的C语言空指针NULL详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Python手写神经网络实现3层感知机
- 下一篇: Supervisor管理springbo