我有一个这样的字符串:
char* hello = "Hello, world!";
我必须遍历此字符串中的每个字符。我试过这些,但是他们要么给我编译错误,要么违反访问权限,或者只是永远不要离开循环:
for( char* p = hello; p!=0; p++ ) printf("%x\n", p);
for( char* p = &hello; p!=0; p++ ) printf("%x\n", p);
for( char* p = *hello; p!=0; p++ ) printf("%x\n", p);
for( char* p = hello; *p!=0; *p++ ) printf("%x\n", *p);
我真的不明白指针在C中是如何工作的,我只是随机地放置星号直到它起作用,在这种情况下它不会。
我不像其他问题那样使用strlen
。
答案 0 :(得分:5)
p
是指向char
的指针。因此,用*p
取消引用它会产生
char
。
向p
添加1会将其移动到您所在的任何字符串中的下一个字符
遍历。向*p
添加1会向字符p
添加一个指向
到。
让我们仔细检查每一次尝试,看看它有什么问题。
char* hello = "Hello, world!";
公共部分:hello
是指向char
的指针,它指向一个
编译器将嵌入对象中某处的常量字符串
文件。请注意,不应更改此类字符串;你经常会得到
这样做会出错。
如果您想要更改字符串,char hello[] = "Hello, world!";
作品;这会创建一个缓冲区作为可以自由的局部变量
操纵。
for( char* p = hello; p!=0; p++ ) printf("%x\n", p);
在这里,您正确地将p
指向hello
的第一个字符。
但是,您可以通过比较p
来查找字符串的结尾
零。 p
是一个指针,0作为指针意味着一个NULL指针。
for( char* p = &hello; p!=0; p++ ) printf("%x\n", p);
在这里,您将p
指向hello
的地址,意思是“{1}}
进程存储称为hello
的指针。解除这个意愿
给你hello
,而不是它指的是什么。
for( char* p = *hello; p!=0; p++ ) printf("%x\n", p);
在此,您取消引用hello
,为char
提供值H
。
将此值分配给p
是类型不匹配,语义上不正确
好。
for( char* p = hello; *p!=0; *p++ ) printf("%x\n", *p);
最后,您正确地将p
指向的内容与零进行比较。
但是,您也会增加
*p
而不是p
,这是不正确的,
而且(如上所述)将导致常量字符串出现问题
比如这个。*p++
也将增加p
,返回p
之前指出的内容
增量,因为没有使用,所以没有实际意义。
另一件事:你想要打印指针 p
的值,或者
它指向的char
?前三个打印指针
正确。最后一个使用%x
打印char
。不知道是什么
会这样做,但不会是正确的。
由于您使用了%x
,我假设您要打印字符本身
十六进制?那将是printf("%x\n", *p);
和前一个一样。但是,我
会建议%02x
使用零填充来获得恒定的宽度。
假设您要打印字符,这是一个正确的版本:
for( char* p = hello; *p!=0; p++ ) printf("%x\n", *p);
或者,由于0
是假的,我们可以更简单地说一下:
for( char* p = hello; *p; p++ ) printf("%x\n", *p);
答案 1 :(得分:3)
他们都不是。
答案是:for( char* p = hello; *p !=0; p++ ) printf("%x\n", *p);
char * p =你好; // p指向第一个hello的情况,它与char *p = &hello[0];
if(*p == 0)
//检查* p =='\ 0'(ASCII中的'\ 0'== 0,表示字符串的结尾)。 * p是每p指向的地址的值。
'p ++'//增加sizeof(char)的p(所以它是+ = 1)。有了这个你好的问候[1]然后你好[2]等......