Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C字符指针获取特定字符_C_String_C Strings - Fatal编程技术网

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