Null - 計(jì)算機(jī)中表示空值的概念
在計(jì)算機(jī)中通常表示空值,無結(jié)果,或是空集合。
指針
Null是一特殊指標(biāo)值(或是一種對象引用)表示這個(gè)指標(biāo)并不指向任何的對象。這樣的指標(biāo)稱之為Null指標(biāo)。有許多實(shí)現(xiàn)上是以0(全位為0)代表null指標(biāo),多數(shù)的CPU以此作為內(nèi)存空間的底(雖有些系統(tǒng)會(huì)使用有符號(hào)位址空間(signedaddressspace),并允許為負(fù)值)。一旦用null來存取其記億體,許多操作系統(tǒng)會(huì)發(fā)生意外事件。一些語言使用其他的命名方式來表示這種指標(biāo),如Pascal,Ruby以及Lua則使用nil,而VisualBasic使用Nothing。Fortran不支援此一常數(shù),但其屬性(property)可被設(shè)定成NULLIFY并由ASSOCIATED函數(shù)測試之。
在C語言的頭文件stddefh中,NULL的定義如下:
#ifndefNULL
#ifdef__cplusplus
#defineNULL0
#else
#defineNULL - - void*0
#endif
#endif
#interfaceNULL0
可見,NULL指針是一個(gè)無類型指針,并且值為0。一個(gè)指針,擁有2個(gè)屬性——地址值和指針類型。兩者的作用是:
1、地址值標(biāo)識(shí)變量的首地址(32位系統(tǒng)下指針的地址值占4字節(jié))。
2、指針類型告訴編譯器,應(yīng)該怎樣進(jìn)行接下來的數(shù)據(jù)訪問(int型數(shù)組和float型數(shù)組是不同的;數(shù)組訪問與結(jié)構(gòu)體訪問也是不同的;等等)。
NULL的出現(xiàn)是一種約定俗成,事實(shí)上它不是C語言中的關(guān)鍵字;把一個(gè)指針賦值為NULL,通常的說法是“將指針懸空”。這樣,指針就無法再進(jìn)行任何數(shù)據(jù)訪問了。編程工作中有一類比較容易犯的錯(cuò)誤——指針地址未進(jìn)行正確的更新賦值就加以使用,這往往會(huì)造成很嚴(yán)重的后果(對內(nèi)存區(qū)進(jìn)行錯(cuò)誤的涂抹)。所以一個(gè)良好的習(xí)慣是,當(dāng)一個(gè)指針的工作稍事休息,先把它賦值為NULL,待到再度使用時(shí),重新對其賦值以及進(jìn)行指針類型轉(zhuǎn)化。
前面說到“NULL指針無法再進(jìn)行任何數(shù)據(jù)訪問”,其實(shí)是視編譯器功能而定的。0位置指向的是程序起始,對于不同的編譯器,NULL指針的操作結(jié)果是不同的:有些是不準(zhǔn)讀寫,有些是只讀,甚至讀寫都允許。編譯器是人定的。引用網(wǎng)友win_hate在話題“關(guān)于NULL的不嚴(yán)謹(jǐn)”中的話來說:“如果說有誰不嚴(yán)謹(jǐn)了,那必定是讀取0位置的程序員,而不是C。C的設(shè)計(jì)哲學(xué)之一是:‘程序員知道自己在干什么——沒有安全帶’”。
疑惑
NULL與0有著扯不斷理還亂的關(guān)系,其實(shí)不那么高深。0本身有著一些原生的特性諸如:起始,沒有,正負(fù)的分界線,0/1中的0還可以表示否定。NULL正需要這些特性中的一部分。只需要清楚NULL的本質(zhì),并在合理的地方才加以利用而非濫用。
PHP
1、特殊的NULL值表示一個(gè)變量沒有值。NULL類型唯一可能的值就是NULL。
注:NULL類型是php4引進(jìn)的。
2、在下列情況下一個(gè)變量被認(rèn)為是NULL:
被賦值為NULL。
尚未被賦值。
被unset()。
數(shù)據(jù)庫
Null在數(shù)據(jù)庫中表示不知道的數(shù)據(jù),主要有3種意思:
1、知道數(shù)據(jù)存在,但不知道具體值。
2、不知道數(shù)據(jù)是否存在。
3、數(shù)據(jù)不存在。
JAVA
java中的null是一個(gè)關(guān)鍵字,通常用來聲明一個(gè)空引用。
Objecto=null
表示o對象是一個(gè)空引用,如果程序員對它進(jìn)行了引用,就會(huì)拋出一個(gè)Null Pointer Exception異常。
函數(shù)
函數(shù)null用來求解零空間,即滿足方程組A*X=0的解空間。實(shí)際上是求出解空間的一組解(基礎(chǔ)解系)。
語法:z=null - A%z的列向量為方程組的正交規(guī)范基,滿足z‘xz=I。
z=null - A,'r'%z的列向量是方程A*X=0的有理基。
Null modem
C++
在C++中NULL直接定義為0,而在C里,NULL是定義為 - void*0的,這也很好理解,C語言可以隱式轉(zhuǎn)換,而C++卻是需要顯示的寫出類型轉(zhuǎn)換的。于是在C++中,就干脆直接將NULL定義為0。
