为什么可以将Char指针变量初始化为字符串,而INT指针变量不能初始化到整数数组

Why can a char pointer variable be initialized to a string but an int pointer variable can not be initialized to an array of integers?

本文关键字:指针 变量 初始化 INT 不能 数组 整数 Char 为什么 字符串      更新时间:2023-10-16

我正在尝试了解字符串,数组和指针之间的关系。

我正在阅读的书有一个程序,其中该程序初始化了一个变量,如下所示:

char* szString= "Name";

我理解的方式是,C风格的字符串只是一系列字符。数组只是指指指针(存储数组的第一个值(和偏移量的速记版本。IE。 array[5]实际上返回从表达式*(array+5)进行评估的内容。

因此,从我的理解和测试中,SZSTRING实际上是作为指针初始化的,指向数组存储"名称"的第一个地址。我可以推断出来,因为输出为:

cout << *szstring;

是字符" n"。

我对语句的理解

cout << szstring;

输出字符"名称",是该方法cout将参数szstring解释为字符串类型,并打印出所有字符,直到nul字符。另一方面,用于参数*szstring使用此方法的不同版本支持C风格字符串。

因此,如果我可以初始化一个char类型指针来解决一个字符中的第一个元素(c-style字符串(,为什么我不能初始化int类型的指针,以作为整数数组中的第一个元素作为如下:

int* intArray = {1,2,3};

c风格的字符串只是一个chars

的数组

正确。

数组只是指指指针(存储数组的第一个值(和偏移量的速记版本。

不,不是真的。

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

cout不是"方法",而是其operator<<的工作方式是。

为什么可以将Char指针变量初始化为字符串,而INT指针变量不能将其初始化为整数数组?

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

在许多方面,包括这种方式,语言标准决定字符串文字和 char*s。

的特殊处理

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

c 可以最终扩展了其他指针初始化的语法来执行类似的操作,但实际上并不需要,因为我们具有优越性:

std::vector<int> myInts{1,2,3};

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

字符串文字是数组类型的字面价值,它是一个lvalue,因此您可以使用并存储它的地址。该值指定的对象的寿命是永久的,因此在整个程序中获得的指针都是有效的。

相比之下,没有字面的" int数组"类型,也没有未命名的Int Array lvalues。

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

如果有的话,语言语法中唯一的奇数人是允许初始化带有支撑列表包含的字符串的字符串的字符阵列的字符串: char a[] = {"foo"};将其视为一种类型复制初始化;a是字面lvalue的副本。

作为初学者,我也有类似的问题。请查看此帖子和答案。

const char* szString= "Name"分配给指针szString,其内容为"名称"的数组的初始元素的地址(随后是终止' 0'null字符(。

没有从int到int*的隐式转换,而另外0是一种特殊情况,是一个零指针。