为什么这不起作用:
摘录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]指向的值字段中。
有人能描述这种差异吗?
答案 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
,然后加零(索引),然后尝试再次取消引用。