这只是一种扫描字符串的技术。
当你只是告诉字符串char *string1 = "hello"的起始地址时,将存储在变量char *string1而不是字符串中。一种做法是在不使用时分配一个指针NULL,而不是允许其中的旧地址值,这现在是无效的。因此,如果在某个时候我们做了string1 = NULL,那么if (string1)将是错误的,因为NULL计算结果为 0。
a1 a2 a3 a4 a5 a6
+-----+-----+-----+-----+-----+-----+
string1 = | h | e | l | l | o | \0 |
+-----+-----+-----+-----+-----+-----+
而当我们这样做*string1时,基本上是形式*(string + x)。根据指针的类型string1,x元素将首先被跳过,然后*将在该位置进行解引用,x元素远离存储的地址string1。
a1 a2 a3 a4 a5 a6
+-----+-----+-----+-----+-----+-----+
string1 = | h | e | l | l | o | \0 |
+-----+-----+-----+-----+-----+-----+
^
|
+-------------+
|
*(string1 + 3) same as string1[3]
因此,doing*string1将获取存储在中的地址所指向的值string1。
所以
if (string1)
{
while (*string1)
{
count++;
string1++;
}
}
这将输入if如果存储在字符串中的地址不是 NULL,即分配了一些有效地址(如果我们按照约定将 NULL 分配给未使用)。在特定迭代中存储的地址指向非零值*string之前,它将为真。string1C 字符串以 NUL 字符结尾,该字符是'\0'并且具有 ASCII 值0。在我们执行的每次迭代中string1++,这将增加存储的地址值,并且在每次增加之后,值string1将指向下一个相邻的元素(首先a1然后a2等)。当它指向'\0'存储的地址时,*string1将为 0 并且while (*string1)为 false 从而跳出循环。