为什么char指针变量可以初始化为字符串但int指针变量不能初始化为整数数组?

Fil*_*zek 15 c++ arrays string pointers

我试图理解字符串,数组和指针之间的关系.

我正在阅读的这本书有一个程序,它在其中初始化变量如下:

char* szString= "Name";
Run Code Online (Sandbox Code Playgroud)

我理解这一点的方式是,C风格的字符串只是一个字符数组.数组只是引用指针(存储数组的第一个值)和偏移量的简写版本.即 array[5]实际上返回从表达式计算的内容*(array+5).

因此,根据我的理解和测试,szString实际上被初始化为指向存储"Name"的数组的第一个地址的指针.我可以推断出这个因为输出到:

cout << *szstring;
Run Code Online (Sandbox Code Playgroud)

是字符"N".

我对声明的理解

cout << szstring;
Run Code Online (Sandbox Code Playgroud)

输出字符"Name",方法cout将参数szstring解释为字符串类型,并打印出所有字符,直到NUL字符.另一方面,对于参数*szstring,使用支持C样式字符串的此方法的不同版本.

因此,如果我可以初始化一个char类型指针来寻址一个chars数组中的第一个元素(一个C风格的字符串),为什么我不能初始化一个整数数组中第一个元素的int类型指针,如下所示:

int* intArray = {1,2,3};
Run Code Online (Sandbox Code Playgroud)

Lig*_*ica 7

C风格的字符串只是一个字符数组

正确.

数组只是引用指针(存储数组的第一个值)和偏移量的简写版本.

不,不是真的.

方法cout将参数szstring解释为字符串类型,并打印出所有字符,直到NUL字符

cout不是一种"方法",但它的operator<<工作方式是肯定的.

为什么char指针变量可以初始化为字符串但int指针变量不能初始化为整数数组?

简单的答案是字符串文字是特殊的,否则我们将无法使用它们.

在许多方面,包括这种方式,语言标准规定了字符串文字和char*s的特殊处理.

为什么我不能初始化一个int类型指针指向整数数组中的第一个元素

C++ 可以有最终扩展其他指针initialisations做类似的事情的语法,但它实际上确实不需要,因为我们已经成功了远远优于:

std::vector<int> myInts{1,2,3};
Run Code Online (Sandbox Code Playgroud)


Ker*_* SB 6

简短的回答是存在字符数组文字,但没有int数组文字.

字符串文字是数组类型的文字值,它是一个左值,因此您可以获取和存储其地址.由这样的值指定的对象的生命周期是永久的,因此这样获得的指针在整个程序中都是有效的.

相比之下,没有类型"数组int"的文字,也没有未命名的int数组左值.

不要将它与支持的初始化列表混淆,后者不是表达式,因此也不是值!支撑列表可用于初始化数组类型的变量,但它们本身不是值.

如果有的话,语言语法中唯一的奇怪的是允许用包含字符串文字的支撑列表初始化一个char数组:char a[] = {"foo"};把它想象成一种复制初始化; a是文字左值的副本.