C字符指针获取特定字符
可能是个愚蠢的问题,但如何访问字符指针中的特定字符 我试着跟随C字符指针获取特定字符,c,string,c-strings,C,String,C Strings,可能是个愚蠢的问题,但如何访问字符指针中的特定字符 我试着跟随 char *pointer = "Hello"; printf("%s", pointer); // prints "Hello" printf("%s", &pointer[0]); // also prints "Hello" 但我想要的是printf(???)=>“H”。单个字符。或“e”。怎么可能呢?指针是指向char的指针,也称为char* 在char*pointer=“Hello”之后,指针指向“H” 当给出p
char *pointer = "Hello";
printf("%s", pointer); // prints "Hello"
printf("%s", &pointer[0]); // also prints "Hello"
但我想要的是printf(???)=>“H”。单个字符。或“e”。怎么可能呢?
指针是指向char
的指针,也称为char*
在char*pointer=“Hello”之后代码>,指针
指向“H”
当给出printf
时,%s
,它接受一个char*
并打印它从该位置开始找到的所有字符,直到看到一个空字符为止
要让printf
打印单个字符,请将实际字符值(不是指针)传递给它,然后使用%c
:
printf("%c", *pointer);
或:
或者,对于“e”而不是“H”:
printf("%c", pointer[1]);
创建指针并将其分配给“Hello”的基址
指针和&指针[0]是相同的东西
指针[n]取地址“Hello”并用数字“n”将其偏移,请确保不要索引地址的结尾,否则您将读取垃圾
因此:
要访问char*
的char
,只需像数组一样使用[]
操作符即可
char *pointer = "Hello";
printf("%s", pointer); // ok
printf("%s", &pointer[0]); // wrong way of accessing specific element (it is same as the base address.., thus %s prints the whole thing)
而是访问char*
或字符串literal的第一个元素的地址。。为什么
printf("%c", pointer[0]); // use this one
就像数组一样,访问所需的元素
但是,为了更好,请注意:
#include <stdio.h>
int main() {
char *pointer = "Hello";
printf("%s\n\n", pointer); // ok
printf("%c", pointer[0]);
printf("%p == %p\n", (void *)&pointer[0],(void *)pointer);
// cast to void * to avoid undefined behavior
// pointed out by @ex nihilo
printf("%p", pointer+1);
return 0;
}
如您所见,指针
保存第一个元素的地址,即:&指针[0]
,因此您可以得到相同的输出 您是否查看了%c
选项。。。和很长,但仍然值得一读。指针与&pointer[0]相同,若要索引到字符串中,请使用指针[n],其中n是所需字符的基0索引。是的,它给了我一个随机字符,因此我不能使用%c。&指针[0]
相当于指针
相当于&*指针
。就这样,谢谢。我没有想到%s属性可以打印整个字符串。您向我展示了我可以像以前一样访问字符。您还可以使用&pointer[1]打印“ello”或其他任何内容,因为它将转换为获取在“n”处指定的位置的地址。您的注释//错误!是错误的,两者都是有效的,并且都会做同样的事情。是的。。作为第一个元素的地址&基址是相同的。。。我的意思是要获得正确的元素,在打印地址时,您需要强制转换为void*
,以避免未定义的行为:例如printf(“%p==%p\n”,&pointer[0],pointer)
-->printf(“%p=%p\n”,(void*)&pointer[0],(void*)pointer)
和printf(“%p”,(void*)(pointer+1))
char *pointer = "Hello";
printf("%s", pointer); // ok
printf("%s", &pointer[0]); // wrong way of accessing specific element (it is same as the base address.., thus %s prints the whole thing)
printf("%c", pointer[0]); // use this one
#include <stdio.h>
int main() {
char *pointer = "Hello";
printf("%s\n\n", pointer); // ok
printf("%c", pointer[0]);
printf("%p == %p\n", (void *)&pointer[0],(void *)pointer);
// cast to void * to avoid undefined behavior
// pointed out by @ex nihilo
printf("%p", pointer+1);
return 0;
}
Hello
H0x55da21577004 == 0x55da21577004
0x55da21577005