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

Increment operator on pointer of array errors?

本文关键字:运算符 错误 指针 数组      更新时间:2023-10-16

我正在尝试一些非常简单的事情,应该很简单,但它不知何故弄乱了我......

我试图了解++在被视为指针时对数组的影响,当被视为数组时对指针的影响。

所以

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 递增 1,因为 ++ 是 * 的先例,然后 * 开始,我们使其等于 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] 索引指针,它到底指向哪里?发生了哪些变化?

非常感谢所有专家!

数组

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

请注意*(a + 1)*a++并不相同,a + 1是一个有效的指令,因为它只是添加1但不修改a本身,而++a(等于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=apa++是合法的。但是数组名称不是变量;像a=paa++这样的建筑是非法


int* p = (int *)malloc(8);

不要强制转换 malloc() 的结果

将索引与指针一起使用

p[1]=9; // p[1]==*(p+1)