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