sha*_*man 5 c c++ arrays pointer-arithmetic dereference
我正在尝试一些非常简单的事情,应该很简单,但它不知何故让我感到烦恼......
我试图理解++对数组的影响,当被视为数组时被视为指针和指针.
所以,
int main()
{
int a[4] = { 1, 4, 7, 9 };
*a = 3;
*(a+1) = 4;
*++a = 4; //compiler error
}
Run Code Online (Sandbox Code Playgroud)
1:所以在*(a+1)=4我们设置[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
}
Run Code Online (Sandbox Code Playgroud)
2:现在*++ p = 9; 工作得很好,但它的表现并不像数组.两个有什么不同?这只是递增p,并使其等于9.如果我打印p [0],它现在打印9,我看到虽然不能通过p [0]访问它,*(p-1)显示5还在那里.所以用[0]索引指针,它究竟指向哪里?发生了什么变化?
非常感谢所有专家!
数组名称不可修改左值,因此不应用operation ++因此++a尝试修改a是编译时错误(其中a是数组名称).
注意*(a + 1)和*a++不一样的,a + 1是一种有效的指令,因为它只是增加1,但不修改a本身,而++a(即equvilent到a = a + 1)尝试修改,因此错误.
注意'数组名称' 不是指针.指针是可变的,但数组名称不是.当然,当您为指针指定数组名称时,在大多数表达式中,数组名称会衰减为第一个元素的地址.例如
int *p = a;
Run Code Online (Sandbox Code Playgroud)
注意p指向array(a[0])的第一个元素.
表达式a[i]等价于*(a + i),其中a可以是指针或数组名称.因此在你的第二个例子中p[i]是有效的表达.
另外,*++p是有效的,因为因为p是第二个代码示例中的指针(变量).