我该如何解释这个陈述?

时间:2015-06-27 06:43:38

标签: c arrays string pointers

我到目前为止已经了解到以下声明:

char *ch 

声明一个指针,如果我们想将这个指针连接到任何地址,我们必须将其写为:

char *c = &n,但我无法理解以下程序的含义,

#include <stdio.h>

int main()
{
    char *ch = "Hello World" ;

    printf("%s", ch) ;

    return  0 ;

}

请向我解释第2行的分配部分背后的逻辑以及为什么要打印Hello世界。

不应该用* ch代替printf中的ch吗?

3 个答案:

答案 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