指针通过*p=a++初始化为数组a;但它给出错误,为什么?这背后的逻辑是什么?

问题描述 投票:0回答:1

我正在研究指针,有一个测验,这里有一个问题,上面写着 *p=a++;其中 a 是一个包含 4 个元素的数组。它显示了需要增量运算符的左值错误。为什么?

我在想它应该指向数组的第二个元素,即;一个[1]。但我认为错误是因为这里指针没有用某个值初始化,但在它前面给出了一个操作。 (我可能是错的)。

这是代码。

#include <iostream>
using namespace std;
int main() {
    int a[] = {1, 2, 3, 4};
    int *p = a++;
    cout<< *p <<endl;
}

arrays pointers c++14
1个回答
0
投票

编译器可能会给您一条错误消息,例如:

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]

© www.soinside.com 2019 - 2024. All rights reserved.