这只是一种扫描字符串的技术。
当你只是告诉字符串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
之前,它将为真。string1
C 字符串以 NUL 字符结尾,该字符是'\0'
并且具有 ASCII 值0
。在我们执行的每次迭代中string1++
,这将增加存储的地址值,并且在每次增加之后,值string1
将指向下一个相邻的元素(首先a1
然后a2
等)。当它指向'\0'
存储的地址时,*string1
将为 0 并且while (*string1)
为 false 从而跳出循环。