【发布时间】:2017-09-19 18:00:36
【问题描述】:
我试图理解字符串、数组和指针之间的关系。
我正在阅读的这本书有一个程序,它在其中初始化一个变量,如下所示:
char* szString= "Name";
我理解这一点的方式是,C 风格的字符串只是一个字符数组。数组只是引用指针(存储数组的第一个值)和偏移量的简写版本。 IE。
array[5] 实际上返回从表达式 *(array+5) 评估的内容。
所以,根据我的理解和测试,szString 实际上被初始化为一个指针,它指向存储“名称”的数组的第一个地址。我可以推断出这一点,因为输出为:
cout << *szstring;
是字符“N”。
我对声明的理解
cout << szstring;
输出字符“Name”,是方法cout将参数szstring解释为字符串类型,并打印出所有字符,直到NUL字符。另一方面,对于参数 *szstring,使用了支持 C 样式字符串的不同版本的此方法。
因此,如果我可以初始化一个 char 类型指针来寻址 chars 数组(C 样式字符串)中的第一个元素,为什么我不能初始化一个指向整数数组中第一个元素的 int 类型指针如下:
int* intArray = {1,2,3};
【问题讨论】:
-
“数组只是引用指针的简写版本” - 不,它不是。阅读一本好的 C 或 C++ 教科书,了解它的实际含义。
-
+1。我不知道为什么人们不赞成这个;这是一个有趣的问题。我一直认为
"Name"会很乐意留出我们可以获取指针的静态存储,但{1,2,3}不会;但是现在看到这个问题,我意识到我不知道为什么会这样。 -
是的,我也没有得到反对票和接近票。这是一个合理的问题,并没有像亲近的选民所认为的那样过于宽泛。
-
简短回答:因为字符串文字历来在 C 语言中具有特殊地位。
-
为什么不能初始化指向整数数组中第一个元素的 int 类型指针 --
{1,2,3}不是数组,它被称为 list initialization 和它的实际作用取决于上下文。顺便说一句,char* str = { 'a', 'b', 'c' }也是不允许的。
标签: c++ arrays string pointers