当我最近看一些关于C指针的段落时,我发现了一些有趣的东西。它说的是这样的代码:
char var[10];
char *pointer = &var;
while(*pointer!='\0'){
//Something To loop
}
可以变成这个:
//While Loop Part:
while(*pointer){
//Something to Loop
}
所以,我的问题是, *指针是什么意思?
答案 0 :(得分:14)
while(x) {
do_something();
}
只要do_something()
为真,就会重复运行x
。在C中,“true”表示“不为零”。
'\0'
是一个空字符。在数值上,它为零(表示'\0'
的位与零号相同;就像空格是数字0x20 = 32)。
所以你有while(*pointer != '\0')
。虽然指向内存不是零字节。之前,我说“true”表示“非零”,因此比较x != 0
(如果x
为int
,short
等)或{{1} (如果x != '\0'
为x
)与if,while等中的char
相同。
你应该使用这个较短的表格吗?在我看来,没有。这使得阅读代码的人不太清楚其意图是什么。如果你明确地编写了比较,那么循环的意图就更明显了,即使它们在技术上对编译器意味着同样的东西。
因此,如果你编写x
,while(x)
应该是一个布尔值或一个C int,它已经表示一个布尔值(一个真或假的概念)。如果你写x
,那么你关心while(x != 0)
是一个非零整数,并且正在用x
做一些数字。如果您编写x
,那么while(x != '\0')
就是x
,您希望继续前进,直到找到空字符(您可能正在处理C字符串)。
答案 1 :(得分:1)
*pointer
表示取消引用pointer
指向的位置存储的值。当pointer
指向字符串并在while
循环中使用while(*pointer)
时,它等同于while(*pointer != '\0')
:如果找到,则返回loop util null终结符。
答案 2 :(得分:0)
是的,你可以选择它。
请注意,*pointer
是pointer
指向的内存位置的值(或保留地址)。
您的*pointer
现在指向字符数组var
的各个字符。
因此,while(*pointer)
是等效
while(*pointer!='\0').
假设您的字符串初始化为9个字符,请说" 123456789"并且位于地址addr
(记忆位置)。
现在因为声明:
char *pointer=&var;
pointer
将指向字符串的第一个元素" 1234567890"。
当您编写*pointer
时,它将检索存储在addr
的内存位置1
的值。
现在,声明:
while(*pointer)
将等同于
while(49)
因为1
的ASCII值为49,条件评估为 true 。
在将\0
增加九次后,这将持续到达pointer
个字符。
现在,声明:
while(*pointer)
将等同于
while(0)
因为\0
的ASCII值为0
。因此,条件评估为 false 并且循环停止。
<强>摘要强>:
在while(condition)
中,condition
必须为非零才能继续循环执行。如果condition
求值为zero
,则循环停止执行。
while(*pointer)
将一直有效,直到指向内存位置的值为non-zero
ASCII值。
您也可以使用:
if(*ptr){ //instead of if(*ptr!='\0')
//do somthing
}
if(!*ptr){ //instead of if(*ptr=='\0')
//do somthing
}
答案 3 :(得分:0)
*pointer
正是它所说的:&#34;给我存储在指针所指向的地方的价值&#34;。或者&#34;解除引用pointer
&#34;简而言之。在您的具体示例中,取消引用指针会生成字符串中的一个字符。
while(*pointer)
也意味着所说的内容:&#34;当表达式*pointer
产生一个真值时,执行循环体&#34;。
由于C将所有非零值视为true,因此在条件中使用*pointer
始终等效于使用表达式*pointer != 0
。因此,许多C程序员省略!= 0
部分以练习布尔禅。
答案 4 :(得分:0)
让我们从一个简单的例子::
开始int a = 2 ;
int *b = &a ;
/* Run the loop till *b i.e., 2 != 0
Now, you know that, the loop will run twice
and then the condition will become false
*/
while( *b != 0 )
{
*b-- ;
}
同样,您的代码使用的是char*
字符串。
char var[10] ;
/* copy some string of max char count = 9,
and append the end of string with a '\0' char.*/
char *pointer = &var ;
while( *pointer != '\0' )
{
// do something
// Increment the pointer 1 or some other valid value
}
因此,while循环将一直运行直到*pointer
没有击中'\0'
。
while( *pointer )
/* The above statement means the same as while( *pointer != '\0' ),
because, null char ('\0') = decimal value, numeric zero, 0*/
但是当你这样做时while(*pointer != 'x'), where x can be any char
会改变用法。在这种情况下,您的第一个代码将在*pointer hits the 'x' char
之后退出,但您的第二个代码段会一直运行到*pointer hits '\0' char
。