我刚写了一个试用程序,看看我是否可以使用const_cast更改数组指向的内存位置。我知道数组常量指针,但只是想看看它是否被允许,我写下了程序
#include <iostream>
using namespace std;
int main() {
// your code goes here
int arr[10], a ;
(const_cast<int*>(arr)) = &a;
return 0;
}
我收到以下错误消息。此错误消息的含义是什么?这是否意味着我可以从数组中获取constness而不是更改它的值?
prog.cpp: In function 'int main()':
prog.cpp:8:26: error: lvalue required as left operand of assignment
(const_cast<int*>(arr)) = &a;
^
由于
答案 0 :(得分:2)
看看我是否可以使用const_cast
更改数组指向的内存位置
阵列不会指向任何东西。它们是一系列对象。
此错误消息的含义是什么?
非参考类型的强制转换表达式的值类别是prvalue。您只能使用左值作为赋值运算符的左手操作数。因此,您不能将转换表达式用作赋值中的左侧操作数。
这是否意味着我可以从数组中获取const ...
数组首先不是const
,因此使用const_cast
删除 constness 是没有意义的。
......但不改变它的价值?
您可以更改非const数组中对象的值,但不能将数组分配给另一个,即使它们是非const。您也不能指定指向数组变量的指针。
我不能做arr =&amp; a因为arr是数组是const指针
不,数组不是 const指针。
正如我前面指出的那样,你不能这样做,因为你不能指定一个指向数组变量的指针。
目前,您正在尝试将int[10]
的类型更改为int*
。它们是不相关的类型。 const_cast
只能用于更改常量或波动率。它不能用于更改类型。
如果要指向内存位置,那么您需要的是指针。要创建指针变量,您不能简单地强制转换数组。下面是一个如何定义指针并将其初始化为指向数组的第一个元素的示例:
int arr[10];
int* pointer = arr;
这就是你可以改变指针所指向的内存位置的方法:
int arr2[10];
pointer = arr2;
答案 1 :(得分:1)
不,你不能“改变数组指向的内存位置”。
这是因为在您的问题的上下文中,“数组”不是可以更改其值的离散变量。数组的名称是实际数组中第一个元素的别名。它不是一个可以改变其值的实际物理变量。它只是一个不可变的标签,引用了一些连续的元素数组。
考虑一下:
int a;
&a;
您要求的基本上是您可以更改&a
指向的内容。您不能&a
指向,a
,而且您无法做任何改变。