- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在阅读了一些关于为什么C / C++中的数组是不可修改的左值的答案之后,我仍然有些困惑。
根据公认的答案(总结如下):Why array type object is not modifiable?
C is written in such a way that the address of the first element would be computed when the array expression is evaluated.
This is why you can't do something like
int a[N], b[N];
a = b;because both a and b evaluate to pointer values in that context; it's equivalent to writing 3 = 4. There's nothing in memory that actually stores the address of the first element in the array; the compiler simply computes it during the translation phase1.
a = b
时,我觉得
b
应该衰减为一个指向
b
的第一个元素的指针值。
a
也会衰减为指针值,但是我不确定。
a = b
如何等效于
3 = 4
?
address of a = address of b
吗?
最佳答案
由于在最后几个问题上可衡量的程度,您对数组/指针转换的困惑似乎是由于难以理解指针本身而造成的。让我们从快速总结开始。
指针基础知识
指针只是一个普通变量,将其他地址作为其值。换句话说,指针指向可以找到其他内容的内存地址。通常情况下,您会想到一个包含立即值的变量,例如int a = 5;
,指针将仅保存5
存储在内存中的地址。要声明一个指针本身并分配一个地址作为其值,可以使用一元'&'
运算符获取该类型的现有对象的地址。例如,int *b = &a;
接受a
的地址(其中5
存储在内存中),并将该地址分配为指针b
的值。 (b
现在指向a
)
要引用指针所保存地址的值,可以通过在指针名称之前使用一元'*'
字符来取消引用指针。例如b
保留a
的地址(例如b
指向a
的地址),因此要获取b
所保存的地址的值,您只需取消引用b
即可,例如*b
。
无论对象的类型如何,指针算术都以相同的方式工作,因为指针的type
控制着指针算术,例如:如果使用char *
指针,则pointer+1
指向下一个字节(下一个char
),对于int *
指针(通常为4个字节的整数),pointer+1
将指向下一个int
,位于pointer
之后4个字节的偏移处。 (因此,一个指针只是一个指针。...算术由type
自动处理)
数组是访问指针的第一个元素转换为指针
继续进行数组指针转换,C和C++标准都定义了如何在存在4个异常的情况下将array type
转换为访问时的指针。请注意,此处的C++标准将依赖于“基本类型”的C标准,并将在C++标准中添加定义以在必要时扩展C标准。数组/指针转换的基本行为由C11 Standard - 6.3.2.1 Other Operands - Lvalues, arrays, and function designators(p3)提供
§ 6.3.2 Other operands
6.3.2.1 Lvalues, arrays, and function designators
Array pointer conversion
(p3) Except when it is the operand of the sizeof operator, the _Alignof
operator, or the unary '&' operator, or is a string literal used to
initialize an array, an expression that has type "array of type" is
converted to an expression with type "pointer to type" that points to
the initial element of the array object and is not an lvalue.
a
和数组
b
,则该标准本身禁止您使用以下方法更改该指针所持有的地址:
a = b;
a
元素的能力。
§ 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.
§6.3.2.1(p3)
枚举的4个异常的影响),并且所得的指针无法修改或分配给另一个地址。修改的限制与普通指针的行为没有任何关系,而仅仅是由于C / C++标准定义转换的方式,并且不能修改结果指针类型。 (所以简短的答案是因为标准规定您不能这样做)
关于c++ - 阵列衰减和修改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57438758/
liwen01 2024.08.18 前言 无论是在产品开发还是在日常生活中,在使用无线网络的时候,都会经常遇到一些信号不好的问题,也会产生不少疑问: 为什么我们在高速移动的高铁上网络会变
我正在使用 Kinect 获取每个关节的位置和方向,然后将它们发送到 Unity。我注意到值有很多“跳跃”或波动,例如,有时我不移动我的手,而在 Unity 中它会旋转 180 度。 我想要的是一个平
在下面的示例中, #include #include //okay: // template decltype(auto) runner(T&& t, F f) { return f(st
出于某种原因,即使我设置了衰减因子,我的学习率似乎也没有改变。我添加了一个回调来查看学习率,它似乎在每个纪元之后都是一样的。为什么没有变化 class LearningRatePrinter(Call
考虑下面的代码: #include #include using namespace std; template void Test2(future f, Work w) { async([
我是一名优秀的程序员,十分优秀!