首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >数组错误指针上的增量运算符?

数组错误指针上的增量运算符?
EN

Stack Overflow用户
提问于 2013-10-13 06:26:28
回答 2查看 4.4K关注 0票数 5

我在尝试一些很简单的东西,应该很简单,但不知怎么的,它在耍我.

我试图了解++在作为指针处理时对数组的影响,以及当作为数组处理时对指针的影响。

所以,

代码语言:javascript
复制
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。但是这段代码就是不能工作.为什么会这样呢?

另一个问题是:

代码语言:javascript
复制
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仍然存在。因此,索引指针时,它究竟指向了哪里?什么改变了?

非常感谢所有的专家!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-10-13 06:28:11

数组名称不是可修改的lvalue,因此不应用操作++,因此试图修改a++a是编译时错误( a是数组名)。

注意,*(a + 1)*a++是不一样的,a + 1是一个有效的指令,因为它只是添加1,但不修改a本身,而++a (等同于a = a + 1)试图修改一个因此的错误。

注意:“数组名称”不是指针。指针是可变的,但是数组名称不是。当然,当您将数组名称分配给指针时,在大多数表达式中,数组名称会退化为第一个元素的地址。例如:

代码语言:javascript
复制
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是第二个代码示例中的指针(变量)。

票数 9
EN

Stack Overflow用户

发布于 2013-10-13 06:29:44

代码语言:javascript
复制
int a[4] = { 1, 4, 7, 9 };
int *pa=a;

数组名称和指针之间有一个区别,必须记住这一点。指针是一个变量,所以pa=apa++是合法的。但是数组名称不是变量;像a=paa++这样的构造是非法的。

代码语言:javascript
复制
int* p = (int *)malloc(8);

Don't cast result of malloc()

使用索引和指针

代码语言:javascript
复制
p[1]=9; // p[1]==*(p+1)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19342510

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档