这是正确的方法来使用指针重新映射?



我想让指针对角线指向矩阵的对角线。代码如下:

program try
implicit none
integer , dimension (3,3), target :: a
integer, dimension(:, :), pointer :: matrix
integer, dimension(:), pointer :: diagonal, base
allocate (base(3*3))
matrix(1:3, 1:3) => base
diagonal => base(1:9:4)
matrix => a
a=reshape([1, 2, 3,4 ,5, 6, 7, 8, 9],[3,3])
print *, diagonal
end program try

但是我得到这个奇怪的数字:17397152 1735357008 1701602145,而不是1,5,9。为什么呢?

当您打印diagonal时,它指向尚未初始化的base。数字1739715217353570081701602145未初始化;它们只是报告程序开始前内存中的内容。

我认为混乱来自你对matrix所做的事情。你最初将matrix指向base。然后将matrix指向a。然而,这消除了matrixbase之间的关联,因此当您初始化a时,base不会发生任何变化。

正如@francescalus所指出的,对角线可以用这个答案来指向:如何将指针赋值给矩阵的对角线?

我怀疑这就是你的目的:

program try
implicit none
integer, dimension(3,3), target  :: matrix
integer, dimension(:),   pointer :: matrix_1d
integer, dimension(:),   pointer :: diagonal

! Initialise matrix.
matrix = reshape([1, 2, 3, 4 ,5, 6, 7, 8, 9], [3, 3])

! Point a 1D pointer at the 2D matrix.
matrix_1d(1:9) => matrix

! Point 'diagonal' at the diagonal elements.
diagonal => matrix_1d(1:9:4)
print *, diagonal
end program try

相关内容

  • 没有找到相关文章

最新更新