【问题标题】:Why this assignment is correct while it looks like assigning an int to int*?为什么这个赋值是正确的,而它看起来像将一个 int 分配给 int*?
【发布时间】:2020-03-16 16:09:18
【问题描述】:

第二次赋值出错(“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;
}

【问题讨论】:

  • int* y[100]; 是一个指向int 的指针的数组x 指向int的指针。
  • 旁注:不要#include &lt;bits/stdc++.h&gt; (reason) 也不要using namespace std; (reason)。

标签: c++ arrays pointers new-operator dynamic-memory-allocation


【解决方案1】:

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

那么,x[0] 的类型为 int&amp;(引用 int),y[0] 的类型为 int*&amp;(引用指向 int 的指针)。

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

【讨论】:

  • @StephenM.Webb 那你会如何解释x[0] = 5;
  • @StephenM.Webb 取消引用指针或索引数组,为您提供对该位置元素的引用。如果没有,您将无法分配给它。
  • @StephenM.Webb Q 被标记为 C++,因此它是 C++ 代码,即使它可以在 C 编译器中编译。 C++ 中确实存在引用,这就是你得到的。我们通过问题上的语言标签,而不是代码的样子。
  • @StephenM.Webb 另外,它是 C 代码。代码中有new,那是不是 C 代码。
  • 我认为这个问题值得单独提出一个问题(如果尚不存在)。 cmets的讨论似乎太长了?
【解决方案2】:

你的声明没有做你认为的事情。这一行:

int* y[100];

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

如果您想要ints 的数组,请不要使用*

int y[100];

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      正如@Andrew Henle 所指出的,int* y[100]; 是一个指向 int 的指针数组,而 x 是一个指向 int 的指针。

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

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

      【讨论】:

        猜你喜欢
        • 2017-10-24
        • 1970-01-01
        • 2011-11-26
        • 1970-01-01
        • 2017-12-11
        • 1970-01-01
        • 2018-02-03
        • 1970-01-01
        相关资源
        最近更新 更多