我在尝试一些很简单的东西,应该很简单,但不知怎么的,它在耍我.
我试图了解++在作为指针处理时对数组的影响,以及当作为数组处理时对指针的影响。
所以,
int main()
{
int a[4] = { 1, 4, 7, 9 };
*a = 3;
*(a+1) = 4;
*++a = 4; //compiler error
}1:,所以在*(a+1)=4,我们设置了a1=4;// *++a = 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: Now *++p = 9;工作正常,但它的行为并不像数组。两个人有什么不同?这只是增量p,使它等于9。如果我打印p,它现在打印9,我看到虽然不能再通过p访问它,*(p-1)显示5仍然存在。因此,索引指针时,它究竟指向了哪里?什么改变了?
非常感谢所有的专家!
发布于 2013-10-13 06:28:11
数组名称不是可修改的lvalue,因此不应用操作++,因此试图修改a的++a是编译时错误( a是数组名)。
注意,*(a + 1)和*a++是不一样的,a + 1是一个有效的指令,因为它只是添加1,但不修改a本身,而++a (等同于a = a + 1)试图修改一个因此的错误。
注意:“数组名称”不是指针。指针是可变的,但是数组名称不是。当然,当您将数组名称分配给指针时,在大多数表达式中,数组名称会退化为第一个元素的地址。例如:
int *p = a;注p指向数组的第一个元素(a[0])。
读一些exceptions where array name not decaying into a pointer to first element?
表达式a[i]等同于*(a + i),其中a既可以是指针,也可以是数组名。因此,在第二个示例中,p[i]是有效表达式。
此外,*++p是有效的,因为p是第二个代码示例中的指针(变量)。
发布于 2013-10-13 06:29:44
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)https://stackoverflow.com/questions/19342510
复制相似问题