我试图理解字符串,数组和指针之间的关系。
我正在阅读的书中有一个程序,它按如下方式初始化变量:
char* szString= "Name";
我理解这一点的方式是,C风格的字符串只是一个字符数组。数组只是引用指针(存储数组的第一个值)和偏移量的简写版本。即
array[5]
实际上返回从表达式*(array+5)
评估的内容。
因此,根据我的理解和测试,szString实际上被初始化为指向存储“Name”的数组的第一个地址的指针。我可以推断出这个因为输出到:
cout << *szstring;
是字符“N”。
我对声明的理解
cout << szstring;
输出字符“Name”,方法cout将参数szstring解释为字符串类型,并打印出所有字符,直到NUL字符。另一方面,对于参数*szstring
,使用了支持C风格字符串的此方法的不同版本。
因此,如果我可以初始化一个char类型指针来寻址一个chars数组中的第一个元素(一个C风格的字符串),为什么我不能初始化一个整数数组中第一个元素的int类型指针为如下:
int* intArray = {1,2,3};
答案 0 :(得分:7)
C风格的字符串只是一个字符数组
正确。
数组只是引用指针(存储数组的第一个值)和偏移量的简写版本。
不,不是真的。
方法cout将参数szstring解释为字符串类型并打印出所有字符,直到NUL字符
cout
不是&#34;方法&#34;,但其operator<<
的工作方式是肯定的。
为什么char指针变量可以初始化为字符串但int指针变量不能初始化为整数数组?
简单的答案是字符串文字是特殊的,否则我们将无法使用它们。
在许多方面,包括这种方式,语言标准规定了字符串文字和char*
的特殊处理。
为什么我不能初始化一个指向整数数组中第一个元素的int类型指针
C ++ 可能最终扩展了其他指针初始化的语法来做类似的事情,但它实际上并不需要,因为相反我们有更高的优势:
std::vector<int> myInts{1,2,3};
答案 1 :(得分:6)
简短的回答是存在字符数组文字,但没有int数组文字。
字符串文字是数组类型的文字值,它是一个左值,因此您可以获取和存储其地址。由这样的值指定的对象的生命周期是永久性的,因此获得的指针在整个程序中都是有效的。
相比之下,没有类型为“int
数组”的字面值,也没有未命名的int数组左值。
不要将此与支持的初始化列表混淆,后者是不是表达式,因此不是值!支撑列表可用于初始化数组类型的变量,但它们本身不是值。
如果有的话,语言语法中唯一的奇怪之处在于允许使用包含字符串文字的支撑列表来初始化char数组:char a[] = {"foo"};
这是一种复制初始化; a
是文字左值的副本。
答案 2 :(得分:1)
作为初学者,我有一个类似的问题。请查看this post和答案。
这个const char* szString= "Name"
为指针szString
分配一个数组的初始元素的地址,该数组的内容为&#34; Name&#34; (后跟终止&#39; \ 0&#39;空字符)。
没有从int到int *的隐式转换,其他0是特殊情况,作为空指针。