【问题标题】:Is an array a data type? [closed]数组是数据类型吗? [关闭]
【发布时间】:2015-03-23 01:49:12
【问题描述】:

数组是数据类型还是指向其第一个元素的指针?

【问题讨论】:

  • 不,这不是意见问题。数组不是指针。
  • @DrewDormann id -> 是
  • 数组既不是指针也不是数据类型。
  • 数组和指针的简单区别!指针是可以赋值的变量,数组不能赋值!这可以证明指针和数组是两个不同的东西!
  • This 可以帮到你。

标签: c++ c arrays types


【解决方案1】:

您询问的是两种不同的语言,C 和 C++。它们碰巧在这个领域(大部分)具有相同的规则,但重要的是要记住它们是两种截然不同(但密切相关)的语言。

这还取决于您所说的“数组”是什么意思。通常最好将“数组”一词视为形容词,而不是名词。因此你可以有一个数组type,一个数组object(一个数组类型的对象),一个数组expression(一个数组类型的表达式) ,等等。

C 和 C++ 标准没有定义短语“数据类型”,尽管这两个标准都非正式地使用了该短语几次。鉴于上下文,很明显“数据类型”与“对象类型”是同义词。

C有两种类型,对象类型和函数类型。 (在 C11 标准之前,不完整类型是第三种;2011 年更改了定义,因此不完整类型是对象类型的子集。)

数组type是一个对象类型(不,这不是见仁见智的问题)。

如果您被告知数组“确实”是指向其第一个元素的指针,那么您就被严重误导了。在大多数但不是所有上下文中,数组表达式被隐式转换为指向数组第一个元素的指针。数组对象依然存在,依然是对象,依然是数组类型。

建议阅读:comp.lang.c FAQ 的第 6 节。

【讨论】:

    【解决方案2】:

    数组是一种类型。它可以称为复合类型或数组类型(C++ 标准,§3.9.2):

    可以通过以下方式构造复合类型:
    — 给定类型的对象数组,(8.3.4)

    (§8.3.4)在哪里,强调我的:

    TD 的声明中,D 的格式为

     D1 [ constant-expressionopt] attribute-specifier-seqopt
    

    声明T D1中标识符的类型是“derived-declarator-type-list T”,那么 D 的标识符是数组类型

    并且,与任何其他类型一样,您可以在typedef 中使用它。来自同一部分:

    typedef int A[5], AA[2][3];
    typedef const A CA; // type is “array of 5 const int”
    typedef const AA CAA; // type is “array of 2 array of 3 const int”
    

    数组类型的对象可以隐式转换为指针,因此可能会造成混淆:

    void foo(int* );
    A some_array;
    
    foo(some_array);       // OK
    int* p = some_array;   // OK
    

    【讨论】:

      【解决方案3】:

      数组是数据类型还是指向其第一个元素的指针?

      它是一种数据类型,它不是指针。

      这是这种常见混淆的根源。

      • 数组可以隐式转换指向第一个元素的指针(但不能反过来)
      • 指针与数组(即“[]”)在语法上有一些相似之处,因此初学者在隐式转换发生时并不总是很明显。

      【讨论】:

      • 其实[]操作符需要一个指针操作数和一个整数操作数。指针需要指向数组对象的一个​​元素。 [] 是根据指针算术定义的:a[i] 表示 *(a+i)
      【解决方案4】:

      严格来说是一个 instance 中具有 数组类型 的对象的数组。所以数组有类型而不是是类型

      虽然数组具有类型(并且是容器数据结构的一个示例),但了解在 C 和 C++ 中,与基本类型不同,class/struct/union 类型它们不是被视为first-class data types,因为它们不能作为参数按值传递、按值返回或分配给或从。

      数组与指针不同 - 在 C 和 C++ 中,数组的 size 等于元素数量乘以每个元素的大小,而指针是指针而不是它所指的大小。但是,由于数组不是一等类型,因此在传递、返回或赋值时,数组“衰减”为指针。

      C++ STL 支持各种容器数据结构类型,这些数据结构类型比原始数组更灵活且通常更安全,并且是一流的类型。

      【讨论】:

      • 数组type 显然是C 和C++ 中的一种类型。对数组类型的对象和表达式可用的操作只有一些限制。
      • @KeithThompson :确实 - 我已经修改了答案,我认为我说的没有什么不同,但没有强调你的观点。
      • 所有类型都是“数据结构”;我认为强调这一点没有用。底线:数组类型就是类型。所有类型都在您可以应用于它们的操作中受到限制。
      • 当然,有一个明显的区别—​​—但它不在“数据类型”和“数据结构”之间。结构是可分配的,它们通常被认为是“一等”类型,但它们与数组位于分界线的同一侧。无论如何,问题是数组是否是“数据类型”;这是一个是或否的问题,我不相信你已经回答了。 (顺便说一句,您的答案的第一个版本错误地说它们不是。)对于术语“数据类型”的任何合理定义,答案很简单:是的:数组类型是一种数据类型。
      • @KeithThompson :是的,但只是简单地说这对对话没有任何帮助。值得注意的是,C 和 C++ 数组的上下文与基本类型和结构属于不同的类别。
      猜你喜欢
      • 2013-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多