gpt4 book ai didi

c++ - 指向数组声明的指针

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:17:16 26 4
gpt4 key购买 nike

考虑以下情况:

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

您能解释一下为什么第 3 种情况会抛出编译时错误吗?与前两者究竟有何不同?我正在寻找对标准的相应引用。

最佳答案

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

详细:

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

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

The declared type of an array object might be an array of unknown size and therefore be incomplete at one point in a translation unit and complete later on; the array types at those two points (“array of unknown bound of T” and “array of N T”) are different types

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

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

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

关于c++ - 指向数组声明的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25979637/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com