我到目前为止已经了解到以下声明:
char *ch
声明一个指针,如果我们想将这个指针连接到任何地址,我们必须将其写为:
char *c = &n
,但我无法理解以下程序的含义,
#include <stdio.h>
int main()
{
char *ch = "Hello World" ;
printf("%s", ch) ;
return 0 ;
}
请向我解释第2行的分配部分背后的逻辑以及为什么要打印Hello世界。
不应该用* ch代替printf中的ch吗?
答案 0 :(得分:1)
根据C标准(6.3.2.1 Lvalues,数组和函数指示符)
3除非它是sizeof运算符或一元&amp;的操作数。 operator,或者是用于初始化数组的字符串文字, an 具有类型''数组类型''的表达式将转换为 带有''指向类型'的指针的表达式,指向初始值 数组对象的元素并且不是左值。如果是数组 对象具有寄存器存储类,行为未定义。
因此在此声明中
char *ch = "Hello World";
在右侧有一个字符文字,其类型包含以下数组char[12]
(字符文字包括终止零&#39; \ 0&#39;)
根据引用,此数组将转换为表达式,该表达式是指向数组的第一个字符的指针(字符串文字)。因此,指针ch
由数组的第一个字符的地址初始化。文本本身由编译器存储在静态内存中。
实际上在这个语句中你定义了两个对象:一个字符数组(字符串文字)和一个指向字符串文字的第一个字符的指针。
尽管C中的字符串文字不是常量数组,但您可能无法使用此类指针更改它们。任何更改字符串文字的尝试都会导致程序的未定义行为。
至于这句话
printf("%s", ch) ;
然后当ch
指向字符串的第一个字符时,则根据格式说明符%s
输出此字符串
答案 1 :(得分:0)
"Hello World:"
字符串将存储到内存的文本段中,其地址将分配给*ch
。
"Hello World:"
是只读的,您无法在以后的代码中对其进行修改。
答案 2 :(得分:0)
"Hello World"
是一个只读的字符串文字。您可以将指针指向 - char
指定给字符串文字,因为字符串文字会转换为类型char*
(指向 - char
)。但是,您不能写入字符串文字,因为字符串文字是不可变的,写入它或尝试修改它将调用未定义的行为。
请注意,我在这里谈论C