C中str == NULL和str =='\ 0'有什么区别?
我想知道str == NULL
和str[0] == '\0'
之间的区别:
int convert_to_float(char *str, double *num) { if ((str == NULL) || (str[0] == '\0')) return(-1); *num = strtod(str, (char **)NULL); return(0); }
我在Linux上使用gcc。
记住str
并不是一个“string”,而是存储char
(string的一部分)的内存位置的指针 。
接下来,我们必须了解编译器如何看到所有这些项目。 我们来看看他们的types:
-
str
的types是char *
(字面意思是“指向char
指针”) -
NULL
是一个空指针常量(至less在我的系统上,它是((void*)0)
) -
'\0'
是一个字符常量(它实际上是int
types的,但不用担心;通常用在需要char
值的上下文中)
在char *
和void *
这告诉编译器这些是指针types(这是一个奇怪的方式,说这种types的variables不具有值,他们只是指向它)。 所以当编译器看到char *str
,它知道你可能会要求做类似*str
或str[0]
的东西(它们都做同样的事情)。 稍后我们将回到这个问题。
你看,当你在C程序中写入str
时,编译器知道一个名为“str”的variables存储在一个存储单元中,例如0x0001。 它生成的代码将转到0x0001并获取该值。 这样,如果你做了这样的事情
str + 1
然后编译器会生成如下所示的代码:
fetch the value from where str is stored (0x0001) add 1 to that value
我确信你知道这一点。 所以现在应该很明显这条线说:
str == NULL
由于NULL
是一个空指针常量,因此该行testingstr
是否为空指针(即,指向任何内容的指针)。
所以编译器通常会生成这样的代码:
fetch the value from where str is stored check if that value is 0
现在请记住,如果你愿意,我们告诉编译器, str
是一个真正的指针types。 所以我们可以写这个:
*str
这使得编译器生成这个:
fetch the value from where str is stored now use that value as a memory address and fetch what is stored there
所以如果str保持0x0200,那么我们将从内存地址0x0200得到值。 请注意,编译器并不在意string是否真的存储在那里。
(我假设你知道str[0]
和*str
是一样的,这使得更容易解释发生了什么。)
那么这个怎么样?
*str == '\0'
所以这条线实际上是:
*str == (char) 0
这使得编译器生成这个:
fetch the value from where str is stored now use that value like a memory address and fetch the char that is stored there check if the value of that fetched char is 0
总结:
- 写入
str == NULL
告诉你指针str
是否指向没有任何东西。 - 写
*str == '\0'
告诉你指针str
是否指向一个空string (实际上是指向一个保存为0的内存位置)。
(根据定义,“string”是一个连续的字符序列,由第一个空字符结尾,所以如果string的第一个字符是'\0'
,那么这个string是一个空string。
str==NULL
告诉你指针是否为NULL。
str[0]=='\0'
告诉你该string是否为零长度。
在该代码中,testing:
if ((str == NULL) || (str[0] == '\0'))
用于捕获它为NULL或具有零长度的情况。
请注意,短路在这里起着关键作用:testing的重点是确保str
是一个长度至less为1的有效Cstring。
- 第二个testing
str[0] == '\0'
只有在str
不为NULL时才能使用。 - 因此,当
str
为NULL时,需要第一次testingstr == NULL
NULL。
实质上
-
str == NULL
确定str
是否是一个NULL
指针 -
str[0] == '\0'
确定str
是否为0长度的c风格string
当你把它们合并在一起时,你正在检查它是NULL还是空的。 这允许函数在方法开始时消除两种forms的空数据
str == NULL
检查str是否为空指针(指向无处)
str[0] == '\0'
(如果不是NULL指针)检查第一个str元素有0值(string没有字符只有0结尾)
str==NULL
告诉你该string是否为NULL
。
*str=='\0'
告诉你该string是否为零。
注意 :这个答案是在神秘的15秒的回答 ,其中有str=='\0'
。 当然,前3到4分钟内所做的更改没有显示出来,他将其固定了。
str == NULL意味着“str指向内存地址零”(或任何地址是NULL在您的系统上)。 通常这意味着根本没有string。
str [0] =='\ 0'表示“str的第一个字符是字符零”(标记string的结尾)。 这意味着有一个string,但它是空的。 想想空杯子和没有杯子; 同样的想法。
在其他语言中,你可能会写str == null
vs str == ""
。 他们是指两个不同的东西。 理解C中的差别尤其重要,因为试图使用NULL指针会使程序崩溃。
str == NULL
表示该string没有任何参考,因为它的指针是空的(意味着string的地址为空)。
str[0] == '\0'
– 表示长度为0的string。
请让我知道,如果有任何错误的解释,或者你还有疑问。
str == NULL
意味着str不指向任何地址=指针是空的。
和str[0] == '\0'
0'str是指向一个有效的地址,这一行检查第一个字符(即str [0])是数字0(ascii值'\ 0')这意味着string的结尾。 那么string是空的。 (str中没有字符:第一个是结束字符)
1 – > str == NULL
确定str是否为NULL指针2 – > str[0] == '\0'
确定str是否为0长度c style string
所以在这个if ((str == NULL) || (str[0] == '\0'))
OR运算符的短路进入图片,因为它确保任何string不指向任何东西或空string..
相当于C#的是:
if (string.IsNullOrEmpty(str)) { }
简单的含义是string是NULL还是空string。