我对C
中字符串字面量及其指针的概念感到非常困惑。
例如,如果我想定义一个指向字符的指针,并且:
char* s = "hello";
printf("%s\n",s); // this print "hello"
因为在C语言中,字符串是字符数组,所以在我看来,char* = "hello"
应该定义一个字符指针,指向字符串中的第一个元素(即'h'的内存地址),它在打印时如何生成整个字符串的字面量?
另一个例子是字符指针定义为:
void stringFunc(char strings[ROWS][COLS])
{
char* initial_p = strings;
}
这应该没问题,因为strings
是一个指针,我们可以为它命名(initial_p),但是gcc坚持认为它是错误的,并强制更正为:
char* initial_p = *strings;
我找不到原因。因为*strings
应该是指针的解引用,而不应该被赋给指针的名称。
2条答案
按热度按时间7vhp5slm1#
因为在C语言中,字符串是字符数组,所以在我看来,
char* = "hello"
应该定义一个字符指针,指向字符串中的第一个元素(即'h'的内存地址),它在打印时如何生成整个字符串的字面量?它在打印时生成整个字符串,因为
printf
的%s
说明符输出一个字符串,并给出指向其第一个字符的指针。它也可以被定义为解引用并输出第一个字符或打印出十六进制的指针,但没有这样定义,因为这种行为更有用。有一种简单的方法来输出字符串是很有用的。指定字符串的逻辑方式是,通过指向第一个字符的指针,因为这是C语言的方式。我找不到原因。因为 * 字符串应该是指针的解引用,而不应该被赋值给指针的名称。
在本例中,
strings
是一个double数组类型,它不是char *
,因此不能赋值给该类型的变量。w8f9ii692#
打印时如何生成整个字符串文字?
S的
如果没有l长度修饰符,则参数应为指向字符类型数组的首元素的指针。数组中的字符写入到(但不包括)终止空字符。如果指定了精度,则写入的字节数不会超过该值。
因此,
printf
会在没有指定长度修饰符作为停止信号时查找空字节,否则,它会继续打印,直到在内存中看到空字节或系统意识到内存访问越界为止-在这种情况下,您很可能会收到分段违规信号,但由于行为未定义,几乎任何事情都可能发生。