c++ - C++ 中的这些 extern 声明有什么区别?

标签 c++ arrays pointers extern

让我们拥有以下内容的文件:

file1.cpp: 双数组[100];

file2.cpp(file1.cpp 的客户端):

/// What the difference between this:
extern double* array;

/// and this?
extern double array[];

如果我使用以第一种方式声明的数组,我会收到段错误。如果是第二个,它工作正常。这让我感到困惑,因为在常规的 C++ 程序中,我可以轻松地执行以下操作,并且这些对象将是相等的:

double array[100];
double* same_array = array;

/// array[0] is equal to same_array[0] here
/// But why they are not equal in the example with extern?

最佳答案

区别在于first是指向double类型的指针
第二个是 double 组。

这里要注意的重要一点是:

数组不是指针!

只要数组类型不合法但指针类型合法,数组类型(可以是数组名称)的表达式将转换为指针。

double array[100];
double* same_array = array;

按照提到的规则,在上面的数组名称中衰减为指向其第一个元素的指针。

为什么你的程序会崩溃?
数组声明创建一个数组,该数组根据存储类(声明位置)占用一些内存。
而指针只是创建一个指向某个地址的指针。您将明确需要使其指向某个有效对象才能使用它。

这应该是一本好书:
<强> How do I use arrays in C++?

关于c++ - C++ 中的这些 extern 声明有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8552453/

相关文章:

c++ - 如何使用带有 std::unique_ptr 成员的自定义删除器?

c++ - 如何将 C++ 仿函数右值引用传递给 lambda 的捕获?

c++ - 列表初始化是隐式转换吗?

c - 此代码在指针数组中返回错误的第一个指针

java - Java 取消引用是如何工作的?

c++ - 在 GCC 的内联汇编中使用 C++ 引用

arrays - 创建后如何在 Perl6 中更改数组的大小?

c - 在 C 中按顺序移位数组

c++ - 多重间接的限制

python - 将形状 (n,) 的数组转换为形状 (n,1) 的 numpy 数组