C++ 阵列衰减与修正

C++ 阵列衰减与修正,c++,arrays,C++,Arrays,在阅读了一些关于为什么C/C++中的数组是不可修改的左值的答案之后,我仍然有点困惑 根据公认的答案(总结如下): C是这样写的,第一个元素的地址 在计算数组表达式时计算 这就是为什么你不能做这样的事情 int a[N], b[N]; a = b; 因为在该上下文中,a和b都计算为指针值;它是 相当于写3=4。实际上,在记忆中没有什么 存储数组中第一个元素的地址;编译程序 只需在转换阶段1计算它 这就是我困惑的时候 当我们有a=b时,我认为b应该衰减为指针值,指向b的第一个元素 我认为a也会衰减

在阅读了一些关于为什么C/C++中的数组是不可修改的左值的答案之后,我仍然有点困惑

根据公认的答案(总结如下):

C是这样写的,第一个元素的地址 在计算数组表达式时计算

这就是为什么你不能做这样的事情

int a[N], b[N];
a = b;
因为在该上下文中,a和b都计算为指针值;它是 相当于写3=4。实际上,在记忆中没有什么 存储数组中第一个元素的地址;编译程序 只需在转换阶段1计算它

这就是我困惑的时候

当我们有
a=b
时,我认为
b
应该衰减为指针值,指向
b
的第一个元素

我认为
a
也会衰减为指针值,但我不确定

我的问题是:

a=b
如何等同于
3=4


它不是更类似于a的地址=b的地址吗?

因为在你最近的两个问题中,你对数组/指针转换的困惑似乎部分是因为难以理解指针本身。让我们从一个简短的总结开始

指针基础知识

指针只是一个普通变量,它将其他对象的地址作为其值。换句话说,指针指向可以找到其他内容的内存地址。通常认为一个变量包含一个立即数,比如
inta=5
,指针只需保存
5
存储在内存中的地址即可。要声明指针本身并将地址指定为其值,可以使用一元
“&”
运算符获取该类型的现有对象的地址。例如
int*b=&a
获取
a
的地址(其中
5
存储在内存中),并将该地址指定为指针
b
的值。(
b
现在指向
a

要引用指针所在地址处的值,可在指针名称前使用一元
'*'
字符取消对指针的引用。例如,
b
持有
a
的地址(例如
b
指向
a
),因此要获得
b
持有的地址的值,只需取消引用
b
,例如
*b

无论对象的类型如何,指针算法都以相同的方式工作,因为指针的
类型
控制指针算法,例如,对于
int*
指针,
Pointer+1
指向下一个字节(下一个
char
),对于
int*
指针(正常的4字节整数),
指针+1
将指向
指针后偏移4字节处的下一个
int
。(因此,指针只是一个指针……其中算术运算由
类型自动处理)

数组是指针的转换器,它是访问时的第一个元素

移动到数组指针转换,C和C++标准都定义了如何将<代码>数组类型< /C> >转换成访问的指针(4个例外)。注意,C++标准将依赖于C标准的“基本类型”,并将添加定义到C++标准,以在必要时扩展C标准。数组/指针转换的基本行为由

该标准明确规定,访问时将数组转换为指向第一个元素的指针会导致指针不是左值。。因此,如果您有数组
a
和数组
b
,则标准本身禁止您使用以下命令更改该指针持有的地址:

a = b;
并且,如评论中提供的示例所述,如果允许,将导致您失去访问
a
元素的能力

C++标准包含C标准中定义的行为,但扩展了数组/指针转换的定义,以解释C中不存在的类型和对象,但不改变. 规定:

扩展是C++标准,具体定义了结果指针,而不是C定义“不是LValk”,并添加了“未知的t”的数组。 <> P>在C和C++中,Access将一个数组转换为指向其第一个元素的指针(受中列举的4个异常的影响),并且不能修改得到的指针或分配阿纳尔的另一个地址。对修改的限制与普通指针的行为方式无关,而完全是由于C/C++标准定义转换的方式,因此无法修改指向类型的指针。(因此,简单的回答是因为标准规定你不能这样做)


仔细检查一下,确保它对你来说是有意义的,并且已经被你理解了。如果你仍然模糊不清,请发表评论。重要的部分是理解指针本身。对数组/指针转换产生的指针的使用限制由标准本身决定。

注释不用于扩展讨论;这段对话已经结束。
a = b;
§ 7.3.2 Array-to-pointer conversion
  1  An lvalue or rvalue of type “array of N T” or “array of unknown bound of T” 
     can be converted to a prvalue of type “pointer to T”. The temporary 
     materialization conversion ([conv.rval]) is applied. The result is a 
     pointer to the first element of the array.