[英]Increment operator on pointer of array errors?
我正在尝试一些非常简单的事情,应该很简单,但它不知何故让我感到烦恼......
我试图理解++对数组的影响,当被视为数组时被视为指针和指针。
所以,
int main()
{
int a[4] = { 1, 4, 7, 9 };
*a = 3;
*(a+1) = 4;
*++a = 4; //compiler error
}
1:所以在*(a+1)=4
我们设置a [1] = 4; //快乐但是当*++a = 4;
,我希望指针a增加一,因为++先于*,然后*启动并使它等于4.但是这段代码不起作用......为什么会这样?
另一个问题:
int main()
{
int* p = (int *)malloc(8);
*p = 5;
printf("%d", p[0]);
*++p = 9; //now this works!
printf("%d", p[1]); //garbage
printf("%d", p[0]); //prints 9
}
2:现在* ++ p = 9; 工作得很好,但它的表现并不像数组。 两个有什么不同? 这只是递增p,并使其等于9.如果我打印p [0],它现在打印9,我看到虽然不能通过p [0]访问它,*(p-1)显示5还在那里。 所以用[0]索引指针,它究竟指向哪里? 发生了什么变化?
非常感谢所有专家!
数组名称不可修改左值,因此不应用operation ++,因此尝试修改a
++a
是编译时错误(其中a
是数组名称)。
注*(a + 1)
和*a++
不一样, a + 1
是一个有效的指令,因为它只需添加1
,但不修改a
本身,而++a
(即equvilent到a = a + 1
)试修改因此错误。
注意'数组名称' 不是指针。 指针是可变的,但数组名称不是。 当然,当您为指针指定数组名称时,在大多数表达式中,数组名称会衰减为第一个元素的地址。 例如
int *p = a;
注意p
指向数组的第一个元素( a[0]
)。
表达式a[i]
等价于*(a + i)
,其中a
可以是指针或数组名称。 因此在第二个例子中, p[i]
是有效的表达式。
另外, *++p
是有效的,因为p
是第二个代码示例中的指针(变量)。
int a[4] = { 1, 4, 7, 9 };
int *pa=a;
数组名称和指针之间必须记住一个区别。 指针是一个变量,因此pa=a
和pa++
是合法的。 但是数组名称不是变量; 像a=pa
和a++
是非法的
int* p = (int *)malloc(8);
使用带指针的索引
p[1]=9; // p[1]==*(p+1)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.