【问题标题】:What is the type of an int array? [duplicate]int 数组的类型是什么? [复制]
【发布时间】:2015-02-18 09:32:47
【问题描述】:

我正在阅读 C++ 中的数组。我尝试了以下代码:

int main()
{
   int a[10];
   int *p;
   p = &a;
}

我得到编译器错误:

pointers.cpp:10:6: error: cannot convert ‘int (*)[10]’ to ‘int*’ in assignment
p = &a;

为了理解能够分配给指针的数组类型,我尝试了以下代码:

int main()
{
   int a[10];
   int *r[10];
   r = a;
}

编译错误:

: error: incompatible types in assignment of ‘int [10]’ to ‘int* [10]’
  r = a;

然后我尝试了这个:

int main()
{
   int a[10];
   int *r[10];
   r = &a;
}

编译错误:

  error: incompatible types in assignment of ‘int (*)[10]’ to ‘int* [10]’
  r = &a;

int (*)[10] 是什么类型?

【问题讨论】:

  • @dandan78 问题是关于 C++,而不是关于 C。数组在两种语言中的工作方式并不完全相同。
  • 如果您不知道自己在做什么,请不要尝试使用 C++。你的房子可能会倒塌。

标签: c++ arrays pointers


【解决方案1】:

int (*)[10] 是一个指向 10 个 ints 的数组的指针。它指向整个数组。在您的第一个代码中,当您执行&a 时,您将获得具有这种类型的整个数组的地址。如果你想存储它,你必须写:

int (*r)[10] = &a;

在您尝试的代码中,int *r[10] 是一个指针数组(而不是指向数组的指针)。

另一方面,int* 指向一个 int。例如,您可以获取数组元素之一的地址 &a[0],它会是 int*

int *p = &a[0];

实际上,数组的名称通常会经历一种称为数组到指针转换的隐式转换,在这种转换中,它变成指向数组中第一个元素的指针。我们通常说数组衰减为指向其第一个元素的指针。

int *p = a; // Here, a is decaying

【讨论】:

    【解决方案2】:

    解决这个问题的正确方法是传递第一个元素的地址:

    int a[10];
    int *p;
    p = &a[0];
    

    其他的可以通过递增p来访问:

    p++;
    

    【讨论】:

      【解决方案3】:

      正如错误所说,它是int (*)[10],因此您应该使用int (*r)[10] 而不是int *r[10]。额外的 () 是指向 10 个整数数组的指针和指向 10 个整数指针的数组之间的区别。

      【讨论】:

        【解决方案4】:

        int数组的类型是什么?

        每种尺寸都有不同的类型。例如,十个数组的类型是int[10]。还有一个不完整的类型int[],表示一个未知大小的数组。

        int (*)[10] 是什么类型?

        这是一个指向大小为 10 的数组的指针。

        在您的第一个 sn-p 中,&a 是指向数组的指针,您不能将其分配给指向单个 int 的指针,因为 intint[10] 是不兼容的类型。在其他示例中,r 是一个指针数组,您不能将任何内容分配给数组。

        您可以使用以下任何一种:

        int *p = a;      // implicit array-to-pointer conversion
        int *p = &a[0];  // explicitly take address of element
        

        分配一个指向数组第一个元素的指针。或者如果你想要一个指向数组的指针(保持其类型的大小),那就是

        int (*p)[10] = &a;
        

        多余的()表示这是一个指向数组的指针,而不是指针数组。

        【讨论】:

          【解决方案5】:

          你只需要这样做

          int a[10];
          int *p;
          p = a;
          

          将数组a的地址赋值给p;即它的第一个元素的地址。

          【讨论】:

            猜你喜欢
            • 2017-11-12
            • 2014-05-18
            • 2020-06-05
            • 1970-01-01
            • 2013-07-20
            • 1970-01-01
            • 2016-06-08
            • 2019-08-10
            • 2018-10-15
            相关资源
            最近更新 更多