5

我正在尝试一些非常简单的东西,本来应该很简单,但它以某种方式困扰着我......

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

所以,

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]索引一个指针,它到底指向哪里呢?发生了什么变化?

非常感谢各位专家!

4

2 回答 2

9

数组名称不是可修改的左值,因此不应用操作 ++,因此++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是第二个代码示例中的指针(变量),所以有效。

于 2013-10-13T06:28:11.957 回答
1
int a[4] = { 1, 4, 7, 9 };
int *pa=a;

必须牢记数组名称和指针之间的一个区别。指针是一个变量,所以pa=apa++是合法的。但是数组名不是变量;像a=pa并且a++是非法的建筑


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

不要转换 malloc() 的结果

使用带指针的索引

p[1]=9; // p[1]==*(p+1)
于 2013-10-13T06:29:44.840 回答