我知道在将char指针与某个char值进行比较时,需要在指针前添加*
,但我在某些代码中找到了比较:
char* c;
// ...
while (*c != ']' && *c != '\0') // search for some character
{
c++;
}
if (c == '\0')
{
return -1; // error
}
所以,我的问题是:这是一个错误还是一个特例?那里不应该if (*c == '\0')
吗?
答案 0 :(得分:15)
你是对的。
c == '\0'
检查指针本身是否等于0,而不是指针指向的字符。
答案 1 :(得分:9)
空指针
整数常量字面值0具有不同的含义,具体取决于使用它的上下文。在所有情况下,它仍然是一个值为0的整数常量,它只是以不同的方式描述。
如果将指针与常量字面值0进行比较,则检查指针是否为空指针。然后将该0称为空指针常量。 C标准定义0转换为void *类型既是空指针又是空指针常量。
此外,为了提高可读性,头文件stddef.h
中提供了宏NULL。
因此,这里有一些检查空指针的有效方法:
if (pointer == NULL)
NULL
被定义为比较等于空指针。实现定义了NULL的实际定义,只要它是一个有效的空指针常量。
if (pointer == 0)
0是空指针常量的另一种表示。
空字符
'\0'
被定义为空字符 - 这是一个所有位都设置为零的字符。这与指针无关。但是,您可能会看到与此代码类似的内容:
if (!*string_pointer)
检查字符串指针是否指向空字符
if (*string_pointer)
检查字符串指针是否指向非空字符。
所以,我的问题是:这是一个错误还是一个特例?不应该有(* c =='\ 0')吗?
代码if (c == '\0')
中的语句检查指针本身是否等于0.也就是说,它检查c是否为空指针。
但我认为这是一个错误,因为检查c是NULL
指针的语句是在访问存储在c的值之后。我认为该程序即将找到一个角色]
。如果它在空字符之前找到字符]
,则它不返回-1。
因此,更正后的陈述应为 -
if (*c == '\0')
{
return -1; // It didn't found the '[' character!
}