【问题标题】:Pointer to array declaration指向数组声明的指针
【发布时间】:2014-09-22 17:16:28
【问题描述】:

考虑以下情况:

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 (*)[]'

您能解释一下为什么第三种情况会引发编译时错误吗?与前两个有什么不同?我正在寻找对标准的相应参考。

【问题讨论】:

  • 你试过extern int (*a)[5]吗?空 [] 有一个技巧,有时会被视为另一个指针,因此您的代码可能会被解释为 extern int (**a)。
  • 只是想知道,给定声明extern int (*a)[];,您的编译器给出的sizeof a 和sizeof *a 是什么?我有一种模糊的感觉,这两个表达式中至少有一个不会编译,因为它试图获取一个未完全声明的对象的大小。
  • 但这正是您之前询问的:a 的类型无法完成。这是your earlier question 的引用。
  • @dyp 在第三种情况下,我有第一个和最后一个声明声明不同类型的变量。

标签: c++ arrays pointers language-lawyer


【解决方案1】:

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

详细说明:

第一个场景很简单: extern int* a 仅声明存在 int * 类型的变量。 第二行定义了相同的变量。

第二种情况: 我再次通读了标准,它是这样说的:

数组对象的声明类型可能是一个未知大小的数组 因此在翻译单元中的某一点是不完整的,并且 稍后完成;这两点的数组类型(“数组 unknown bound of T”和“array of N T”)是不同的类型

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

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

[重新阅读标准后编辑的答案]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多