对于主对角线,您可以小心地执行以下操作:
PROGRAM diagonal
IMPLICIT NONE
REAL, TARGET :: array(4,4)
REAL, POINTER :: ptr(:)
INTEGER :: i
array = RESHAPE([(i,i=1,SIZE(array))], SHAPE(array))
CALL get_diagonal_pointer(array, SIZE(array, 1), ptr)
PRINT "(*(G0,:,','))", ptr
CONTAINS
SUBROUTINE get_diagonal_pointer(arr, n, ptr)
REAL, INTENT(IN), TARGET :: arr(*)
INTEGER, INTENT(IN) :: n
REAL, INTENT(OUT), POINTER :: ptr(:)
!****
ptr => arr(1:n*n:n+1)
END SUBROUTINE get_diagonal_pointer
END PROGRAM diagonal
Run Code Online (Sandbox Code Playgroud)
但请注意,array在主程序中只是连续的并且具有 TARGET 属性。如果array不是简单地连续,那么事情会变得……复杂。
您可以使用中间等级一指针和指针边界重新映射来完成相同的操作。适用于假定大小方法的相同要求。
REAL, POINTER :: tmp(:)
tmp(1:SIZE(array)) => array
ptr => tmp(::SIZE(array,1)+1)
Run Code Online (Sandbox Code Playgroud)
矩阵的上三角形不是“规则的”(要指向的元素之间的间距不同),因此无法指向它。