C++ C++;?

C++ C++;?,c++,arrays,pointers,extern,C++,Arrays,Pointers,Extern,让我们拥有包含以下内容的文件: file1.cpp:双数组[100] file2.cpp(file1.cpp的客户端): 如果我使用以第一种方式声明的数组,我将收到segfault。如果是第二个,它工作正常。这让我感到困惑,因为在一个常规的C++程序中,我可以很容易地执行下列操作,这些对象是相等的: double array[100]; double* same_array = array; /// array[0] is equal to same_array[0] here /// But

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

file1.cpp
双数组[100]

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

如果我使用以第一种方式声明的数组,我将收到segfault。如果是第二个,它工作正常。这让我感到困惑,因为在一个常规的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?

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

这里需要注意的重要事项是:

数组不是指针! 具有数组类型(可以是数组名)的表达式将在数组类型不合法但指针类型不合法时转换为指针

double array[100];
double* same_array = array;
根据前面提到的规则,在上面,数组名衰减为指向其第一个元素的指针

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

这本书应该读得很好:

区别在于,第一个是指向类型double的指针
第二个是double数组

这里需要注意的重要事项是:

数组不是指针! 具有数组类型(可以是数组名)的表达式将在数组类型不合法但指针类型不合法时转换为指针

double array[100];
double* same_array = array;
根据前面提到的规则,在上面,数组名衰减为指向其第一个元素的指针

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

这本书应该读得很好:

当您现在执行
array[i]
,并且在某个地方
array
实际上被定义为一个数组(而不是像上面那样的指针),那么它将尝试将数组的内容解释为一个地址。例如,在另一个文件/另一个翻译单元中,我们定义为

double array[1] = { 0.0 };
让我们假设
0.0
的所有位都为零。然后,上面的
extern double*
上的
array[1]
操作将尝试取消对所有位为零的指针地址的引用。在大多数盒子上,这会崩溃。而对其余的人来说,这将导致胡说八道

当您现在执行
array[i]
,并且在某个地方
array
实际上被定义为一个数组(而不是像上面那样的指针),那么它将尝试将数组的内容解释为一个地址。例如,在另一个文件/另一个翻译单元中,我们定义为

double array[1] = { 0.0 };

让我们假设
0.0
的所有位都为零。然后,上面的
extern double*
上的
array[1]
操作将尝试取消对所有位为零的指针地址的引用。在大多数盒子上,这会崩溃。而对其余的人来说,这将导致胡说八道

指针必须指向某个内存位置。指针必须指向某个内存位置。我真的不明白为什么,这就是为什么我写了一个代码段,其中的指针是相同的,可以以相同的方式处理。是的,有时数组可以像指针一样工作或像指针一样处理。但这并不意味着它们相等。如果您拒绝了解差异并正确使用它们,您就会遇到问题。数组不是指针,但“same_Array[10]”是有效的语句,为什么?因为它是一种语法糖?我真的不明白为什么,这就是为什么我写了一个代码段,它们是相同的,可以用相同的方式处理。是的,有时候数组可以像指针一样工作,或者像指针一样处理。但这并不意味着它们相等。如果您拒绝了解差异并正确使用它们,您就会遇到问题。数组不是指针,但“same_Array[10]”是有效的语句,为什么?因为它是一种语法糖?