C编程:使用字符指针打印一个以null结尾的字符串



我刚刚习惯了C中的指针。我想用%s打印字符数组的第一个字符。

在下面的代码中,为什么%s不起作用,但%c起作用?如果*my_string正在取消引用字符数组的第一个值,%s是否会尝试从该地址开始打印内存中的所有字符,并继续打印,直到达到零字符?

此外,printf("%s", my_string)是如何工作的,而printf("%s" *my_string)不是?

char* my_string = "The original value.";
printf("Value of my_string: %sn", my_string);
my_string = "The new value.";
printf("Value of my_string: %sn", *my_string); // Error
printf("Value of my_string: %cn", *my_string); // Prints only the first letter 'T', but does not have any errors

星号*取消引用指向其所指向类型的指针,因此当my_string是指向字符的指针时,*my_string是字符。您的C编译器看到您的格式字符串包含一个%s和一个参数*my_string,这是一个字符,并向您显示一个错误。

要输出整个字符串,请像第一次调用printf时一样打印它,只打印一个字符,就像上次调用printf时一样。

为什么%s不工作,而%c工作?

这是printf函数工作的规则。对于"%s";它需要一个指向空结尾字符串的指针,对于"%"c";它需要一个字符。

如果*my_string正在取消引用字符数组的第一个值,%s是否会尝试从该地址开始打印内存中的所有字符,并继续打印,直到达到零字符?

是。因此,您必须小心,以防它是一个太长的字符串,并且这些字符可以在null结尾之前打印。

此外,printf("%s",my_string(是如何工作的,而printf("%s"*my_string"(不是?

对于"%s";,它需要一个指针"my_string";是一个角色。

要理解这一点,我们需要深入了解字符串"The original value."是如何存储在内存中的,以及char* my_string指向什么。

我们可以期待像这样的内存结构

0xDEADBEEF    ASCII T
0xDEADBEEF+1  ASCII h
0xDEADBEEF+2  ASCII e
0xDEADBEEF+3  ASCII <space>
...
0xDEADBEEF+16 ASCII u
0xDEADBEEF+17 ASCII e
0xDEADBEEF+18 ASCII .
0xDEADBEEF+19       0

因此,当您有一个char* my_string时,它指向第一个字符,或者在本例中指向地址0xDEADBEEF。因此,当您在printf中使用%s时,它将从您指向的第一个字符开始循环所有字符,直到到达。但*my_string只读取该地址上的第一个字符。因此,我们需要给它一个指针。

相关内容

最新更新