指向数组声明的指针

时间:2014-09-22 17:16:28

标签: c++ arrays pointers language-lawyer

考虑以下情况:

1

extern int *a;
int *a = new int(1); //OK

2

extern int a[];
int a[5]; //Ok

3

extern int (*a)[];
int (*a)[5]; //error: redefinition of 'a' with a different type: 'int (*)[5]' vs 'int (*)[]'

你能解释为什么第三种情况会抛出编译时错误吗?前两次究竟是什么?我正在寻找对标准的相应参考。

1 个答案:

答案 0 :(得分:1)

简而言之: 第三种情况不同,因为指针变量的类型不匹配 - extern声明一个指向未知大小的int数组(不完整类型)的指针,并且定义是针对同一个变量的,但是作为指向5个整数数组的指针,根据标准,它们是不同的(有效)类型。

详细说明:

第一种情况是明确的: extern int * a只声明存在int *类型的变量。 第二行定义了相同的变量。

第二种情况:  我再次阅读标准,这就是它所说的:

  

数组对象的声明类型可能是未知大小的数组   因此,在翻译单位的某一点上不完整   稍后完成;这两个点的数组类型(“数组的数组   未知的T“和”N T“数组的界限是不同的类型

我相信这意味着带有下标的数组的定义将变量的先前声明完成为具有未知大小(无下标)的数组 - 这就是场景中发生的情况2。

第三种情况: 使用与标准相同的含义,这两个点的数组类型具有不同的类型。 因此情况3失败,因为第一和第二声明将声明相同的指针变量作为指向不同类型的指针,从而导致使用不同类型的重新定义"错误

[重读标准后编辑回答]