我刚刚习惯了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
时,它将从您指向的第一个字符开始循环所有字符,直到到达