数组错误指针上的增量运算符
Increment operator on pointer of array errors?
我正在尝试一些非常简单的事情,应该很简单,但它不知何故弄乱了我......
我试图了解++在被视为指针时对数组的影响,当被视为数组时对指针的影响。
所以
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=a
和pa++
是合法的。但是数组名称不是变量;像a=pa
和a++
这样的建筑是非法
int* p = (int *)malloc(8);
不要强制转换 malloc() 的结果
将索引与指针一起使用
p[1]=9; // p[1]==*(p+1)
- C++分数混合比较运算符错误
- 尝试将文件写入数组时运算符<<错误
- 我在C++中遇到插入运算符错误
- 可变长度数组 c++ & 没有运算符>>错误?
- ostream 运算符<<错误C++
- 运算符'=='错误
- 尝试从向量返回对象时出现"没有可行的重载运算符 [] 错误
- 字符串输入中没有匹配的错误运算符错误
- 唯一指针中的赋值运算符错误
- c++ 类型不提供调用运算符错误
- CIN 和 COUT 运算符错误C++
- C++ 未读取我的 % 运算符(错误:"运算符%"不匹配)
- { } 构造函数实现中的赋值运算符 => 错误
- C++重载运算符<错误
- C++ 矢量查找() 重载运算符 - 错误
- 重载的"运算符+"必须是一元或二进制运算符错误
- C++对象 [实现] 运算符 == 错误
- 无法在 Visual Studio 2013 中运行非常基本的代码 - 运算符">>"错误/生成错误
- 自制矢量模板运算符 [] 错误
- C++ 重载<<运算符错误