字符串文字和指针有什么区别?

时间:2018-02-24 20:04:56

标签: c

通常,您可以使用char *str = "Hello"之类的任何字符串文字初始化指针。我认为这意味着"Hello"会返回'H'的地址。但是,不允许使用以下内容。

#include <stdio.h>
#include <stdlib.h>

typedef struct {
    char name[64];
} Student;

Student initialization(char *str) {
    //Student tmp = {}; strcpy(tmp.name, str) //(*1)This is allowed.
    //Student tmp = {"Hello"}; //(*2)This is allowed.
    Student tmp = {str}; //(*3)This is not allowed.
    return tmp;
}

int main(void) {
    (...)
}

有人能告诉我为什么(* 2)被允许但是(* 3)是不允许的?编译此代码会产生以下错误。

warning: initialization makes integer from pointer without a cast [-Wint-conversion]
     Student tmp = {str};
                    ^

1 个答案:

答案 0 :(得分:3)

您尝试初始化char数组的所有这些情况。现在说完之后 - 我们可以看到它让事情变得更容易。就像char数组一样,如果我们直接写下字符串文字,它会使用字符串文字的内容初始化char数组。

但是在第二种情况下,基本上是char数组的字符串文字被转换为指向它的第一个元素的指针(字符串文字的第一个字符),然后用于初始化{{ 1}}数组。那样不行。请注意,即使char是指向不是文字的str数组的指针,这也不起作用。出于与指定相同的原因。 Standard允许直接从字符串文字初始化。不是其他方式。

来自标准6.7.9p14

  

字符类型数组可以由字符串文字或UTF-8字符串文字初始化,可选择用大括号括起来。字符串文字的连续字节(如果有空间或数组大小未知,则包括终止空字符)初始化数组的元素。