C ++:新的,记忆理解问题

时间:2010-06-30 20:32:57

标签: c++ memory new-operator

为什么这不起作用:

摘录1:

int *a = new int[6];
(*a)[0]=1;

这是有效的

摘录2:

int myint = 0;
int *ptr = &myint;
*ptr=1;

我知道如果我在代码段1中使用a[0]=1,那么它就可以了。但对我来说没有任何意义,对我而言,a[0]=1意味着:将值1置于地址[0]。换句话说,我把值作为记忆。相反,使用(*a)[0]=1对我来说更有意义:将值1放到[0]指向的值字段中。

有人能描述这种差异吗?

4 个答案:

答案 0 :(得分:11)

代码段1应为:

int *a = new int[6];
a[0]=1;

这是因为a[0]相当于*(a+0)

答案 1 :(得分:1)

你应该只使用* a not(* a)[0]。

记住'a'是一个指针。指针是一个地址。

*a = a[0] or the first integer
*(a + 1) = a[1] or the second integer

'a'不是指向数组的指针。它是一个指向整数的指针。因此,* a不会将数组交给您,以便[]进行操作。

令您感到困惑的是,整数数组的地址也是该数组中第一个整数的地址。请记住始终牢记您在左侧分配的内容类型。

请考虑以下事项:

int x = 10;

此片段声明一个整数x并为其赋值10.现在考虑一下:

int *y = &x;

此片段声明y是指向整数的指针,它将x的地址指定给y。

你可以这样写:

int x = 10;
int *y;

y = &x;

顺便说一句,当你在上面指定某些东西时,它只会将该地址的数据转换为整数。所以,如果你把它发送到一个char数组(每个8位或1个字节),并且你的系统上一个整数是32位(4字节)长,那么它将只取char数组的前四个字符并转换将32位数转换为int。

用指针仔细踩,这里有龙。

答案 2 :(得分:1)

如果指针指向数组或单个项目,则不明确

(*a)取消引用第一个(或可能是唯一的)项目。

a[0]取消引用第一项。

a[1]显式将指针视为数组,并取消引用第二项。程序员应该确保存在这样的项目。

答案 3 :(得分:1)

索引操作符[]有一个内置的*运算符。所以第一个片段基本上是这样做的:

int *a = new int[6];
*((*a) + 0) = 1;

所以它取消引用一次,将其降为int,然后加零(索引),然后尝试再次取消引用。