1. 程式人生 > >c語言NULL和0區別

c語言NULL和0區別

先看下面一段程式碼輸出什麼:

#include<stdo.h>
int main()
{
    int *p=NULL;
    printf("%s",p);
 
}

輸出(null) ,單步除錯可以看出執行int *p=NULL,p的值為0x00000000,可以看出,NULL在實際底層呼叫中就是0,

在C語言中,

NULL和0的值都是一樣的,但是為了目的和用途及容易識別的原因,NULL用於指標和物件,0用於數值


對於字串的結尾,使用'\0',它的值也是0,但是讓人一看就知道這是字串的結尾,不是指標,也不是普通的數值

在不同的系統中,

NULL並非總是和0等同,NULL僅僅代表空值,也就是指向一個不被使用的地址,在大多數系統中,都將0作為不被使用的地址,所以就有了類似這樣的定義

#define NULL 0

但並非總是如此,也有些系統不將0地址作為NULL,而是用其他的地址,所以說,千萬別將NULL和0等價起來,特別是在一些跨平臺的程式碼中,這更是將給你帶來災難。

看下面解釋:

問 0 '0' '\0' "\0"

To me, when doing C/C++:

0 would digit zero, that is, a numerical value.

'0' could be the character capital oh or the character zero. For example: char word[10] = "Oxford"; char number[10] = "01234";

Depending on typeface used 'O' may look exactly like '0' making it difficult to tell them apart out of context.

'\0' is the null character used to terminate strings in C/C++.

"\0" is an empty string.

百度百科解釋;

\0是C++中字串的結尾標誌,儲存在字串的結尾。比如char cha[5]表示可以放5個字元的字串,由於c/c++中規定字串的結尾標誌為'\0',它雖然不計入串長,但要佔記憶體空間,而一個漢字一般用兩個位元組表示,且c/c++中如一個

陣列cha[5],有5個變數,分別是 cha[0] , cha[1] , cha[2] , cha[3] , cha[4] , 所以cha[5]可以放5個字母或者放2個漢字(1個漢字佔2個位元組,1個字母佔一個位元組),cha[5]佔5個位元組記憶體空間.

  例如:

    char str[5];
    str[0]='a';
    str[1]='b';
    str[2]='c';
    str[3]='d';
    //str[4]='\0'; //abcd    str[4]='e'; /*這樣輸出就是abcde和一堆亂碼,甚至跳出系統錯誤,因為沒有字串結尾符*/
    printf("%s",str);