增加数组错误指针的运算符?

时间:2013-10-13 06:26:28

标签: c++ c arrays dereference pointer-arithmetic

我正在尝试一些非常简单的事情,应该很简单,但它不知何故让我感到烦恼......

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

所以,

int main()
{
    int a[4] = { 1, 4, 7, 9 };
    *a = 3;
    *(a+1) = 4;
    *++a = 4; //compiler error
}

1:所以在*(a+1)=4我们设置[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]索引指针,它究竟指向哪里?发生了什么变化?

非常感谢所有专家!

2 个答案:

答案 0 :(得分:9)

数组名称不可修改左值,因此不应用operation ++,因此尝试修改++a的{​​{1}}是编译时错误(其中a是数组名称)。

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

注意'数组名称'是不是指针。指针是可变的,但数组名称不是。当然,当您为指针指定数组名称时,在大多数表达式中,数组名称会衰减为第一个元素的地址。 e.g。

a = a + 1

注意int *p = a; 指向数组的第一个元素(p)。

阅读一些exceptions where array name not decaying into a pointer to first element?

表达式a[0]等同于a[i],其中*(a + i)可以是指针或数组名称。因此,在您的第二个示例中,a是有效的表达式。

此外,p[i]有效,因为*++p是第二个代码示例中的指针(变量)。

答案 1 :(得分:1)

int a[4] = { 1, 4, 7, 9 };
int *pa=a;

必须牢记数组名称和指针之间的一个区别。指针是变量,因此pa=apa++是合法的。但是数组名称不是 变量;像a=paa++这样的结构是非法的


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

Don't cast result of malloc()

使用带指针的索引

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