我正在研究指针,有一个测验,这里有一个问题,上面写着 *p=a++;其中 a 是一个包含 4 个元素的数组。它显示了需要增量运算符的左值错误。为什么?
我在想它应该指向数组的第二个元素,即;一个[1]。但我认为错误是因为这里指针没有用某个值初始化,但在它前面给出了一个操作。 (我可能是错的)。
这是代码。
#include <iostream>
using namespace std;
int main() {
int a[] = {1, 2, 3, 4};
int *p = a++;
cout<< *p <<endl;
}
编译器可能会给您一条错误消息,例如:
error: cannot increment value of type 'int[4]'
这是因为,像所有自动变量一样,您无法更改它在内存中的位置。与尝试移动非数组变量相比:
int x;
(&x)++; // Error, can't be done either
另请注意,使用
a++
时,您尝试移动 a
指向完整 int[4]
值的位置 - 而不是单个 int
。即使您可以移动a
指向的位置,您也会立即使其指向边界之外(它最初指向的位置)。
我假设您希望它指向第二个元素(在其自身内部),因此在将其原始地址分配给
a
后,您可以添加另一个指向内存的变量,而不是尝试移动 p
在内存中指向的位置到第二个元素:
int* p = a;
int* sa = a + 1; // use `sa` instead of `a` later
您现在可以安全地使用
sa[0]
至 sa[std::size(a) - 2]
。