为什么这个赋值是正确的,但它看起来像是将一个 int 赋值给 int*?

Why this assignment is correct while it looks like assigning an int to int*?

第二次赋值出错("int" 类型的值不能赋值给 "int *" 类型的实体),为什么第一次赋值没有出现同样的错误?

#include <bits/stdc++.h>

using namespace std;

int main()
{
    int* x = new int[100];
    x[5] = 3;

    int* y[100];
    y[5] = 3;

    return 0;
}

xpointer to int 类型,yarray of 100 pointers to int 类型。

那么,x[0]int& 类型(引用 int),y[0]int*& 类型(引用 int).

因此 x[0] = 5int 值分配给 int 引用(完全有效),但 y[0] = 5 试图将 int 值分配给 一个指针,无效。

您的声明与您认为的不符。这一行:

int* y[100];

不创建 int 的数组,而是 int* 的数组。

如果你想要一个 int 的数组,不要使用 *:

int y[100];

这将创建一个包含 100 个 int 的数组。

x 是指向 int 的指针。当您 x[5] = 3; 时,您实际上得到 *(x + 5) = 3;,这会使指针前进,然后取消引用它以到达它指向的 int

y 相同,但 y 不是指向 int 的指针,它是指向 int 的指针数组。这意味着 *(y + 5) 给你一个 int*& 因为数组的元素类型是 int*。您不能将 int 分配给 int*,因此会出现错误。

正如@Andrew Henle 所指出的,int* y[100]; 是指向 int 的指针数组,但 x 是指向 int.

的指针

解析任何 C 声明的有用技术是使用所谓的 Clockwise/Spiral rule.

对此 question 的回答也很有帮助。