数组是数据类型还是指向第一个元素的指针?
答案 0 :(得分:8)
你问的是两种不同的语言,C和C ++。他们碰巧在这个领域(大多数)都有相同的规则,但重要的是要记住他们是两种不同的(但密切相关的)语言。
它还取决于你的意思"数组"。通常最好想到“#34; array"作为形容词,而不是名词;因此,您可以拥有一个数组类型,一个数组对象(一个数组类型的对象),一个数组表达式(一个数组类型的表达式)等等。
C和C ++标准没有定义短语"数据类型",尽管这两个标准确实非正式地使用了这几个短语。鉴于上下文,相当清楚的是短语"数据类型"与"对象类型"。
同义C有两种类型,对象类型和函数类型。 (在C11标准之前,不完整类型是第三种;定义在2011年更改,因此不完整类型是对象类型的子集。)
数组类型是一种对象类型(不,这不是意见问题)。
如果你被告知阵列是真的"真的"指向其第一个元素的指针,你被误导了。在大多数但不是所有上下文中,数组表达式被隐式地转换到指向数组的第一个元素的指针。数组对象仍然存在,仍然是一个对象,并且仍然是数组类型。
建议阅读:comp.lang.c FAQ的第6部分。
答案 1 :(得分:1)
数组是一种类型。它可以称为复合类型或数组类型(C ++标准,§3.9.2):
复合类型可以通过以下方式构建:
- 给定类型的对象数组,(8.3.4)
其中(§8.3.4),强调我的:
在声明
T
D
中D
的格式为D1 [ constant-expressionopt] attribute-specifier-seqopt
并且声明
T D1
中的标识符类型是“ derived-declarator-type-listT
”,然后是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
答案 2 :(得分:1)
数组是数据类型还是指向第一个元素的指针?
这是一种数据类型,不是指针。
[]
")因此,当隐式转换发生时,初学者并不总是很明显。答案 3 :(得分:1)
严格地说是数组的对象的实例中的数组。因此,数组具有类型而不是类型。
虽然数组有类型(并且是容器数据结构的一个例子),但理解在C和C ++中与基本类型不同,并且class
/ struct
/ {{1 }}类型它们不被视为first-class data types,因为它们不能作为参数按值传递,按值返回或分配给或来自。
数组与指针不同 - C和C ++中的数组 size 等于元素数乘以每个元素的大小,而指针是a的大小指针而不是它所指的大小。但是因为数组不是第一类,当传递,返回或赋值时,数组“衰减”到指针。
C ++ STL支持各种容器数据结构类型,它们比原始数组更灵活,更安全,并且是一流的类型。