您提到的复制数组的三种方法,do
循环b(1:n) = a(1:n)
和b = a
,都是等效的;他们将数组的内容复制a
到数组中b
。 a
并且b
只是数组,而不是花哨的指针或任何东西,因此分配a = b
与数学表达式基本相同。引用的进行(用户需要了解)并没有什么魔力,这就是为什么 Fortran 是一种非常简单易学的语言的原因。您可以在 Fortran 中使用指针数组,但这是另一个问题。
M Metcalf 和 J Reid解释的 Fortran 90/95始终是有关 Fortran 语言功能咨询的良好参考。从第 48 页开始:
3.11 数组赋值
通过内在赋值,可以将数组表达式分配给相同形状的数组变量,这被解释为好像表达式的每个元素都被分配给了变量的相应元素。例如,使用声明
real, dimension(10, 20) :: a
那作业
a = a + 1.0
替换a(i,j)
为a(i,j) + 1.0
fori=1,2..,10
和j=1,2,..,20
。
另请注意,标量表达式可以分配给数组,在这种情况下, saclar 值会广播到所有数组元素。
就这一切实际上是如何实现的而言,这就是我认为您提出问题的目的,Fortran 标准完全没有说明这一点。此类事情未指定,以允许编译器编写者进行他们喜欢的任何优化。例如,在 assignmenta = b
中,元素的b
复制顺序a
未由标准指定,因此不同的编译器可以以不同的方式执行此操作。您需要知道的是,对于这个问题,如果a
和b
不是指针,那么a
和b
是不同的数组,并且更改一个元素不会更改另一个元素的相应元素。所以感觉,a=b
是“深拷贝”,您可以将其视为将所有项目复制b
到a
.