Fortran - Con trỏ

Trong hầu hết các ngôn ngữ lập trình, một biến con trỏ lưu trữ địa chỉ bộ nhớ của một đối tượng. Tuy nhiên, trong Fortran, một con trỏ là một đối tượng dữ liệu có nhiều chức năng hơn là chỉ lưu địa chỉ bộ nhớ. Nó chứa nhiều thông tin hơn về một đối tượng cụ thể, như kiểu, thứ hạng, phạm vi và địa chỉ bộ nhớ.

Một con trỏ được liên kết với một mục tiêu bằng cách phân bổ hoặc gán con trỏ.

Khai báo một biến con trỏ

Một biến con trỏ được khai báo với thuộc tính con trỏ.

Các ví dụ sau đây cho thấy khai báo của các biến con trỏ:

integer, pointer :: p1 ! pointer to integer  
real, pointer, dimension (:) :: pra ! pointer to 1-dim real array  
real, pointer, dimension (:,:) :: pra2 ! pointer to 2-dim real array

Một con trỏ có thể trỏ đến -

  • Một vùng bộ nhớ được cấp phát động.

  • Một đối tượng dữ liệu cùng loại với con trỏ, với target thuộc tính.

Phân bổ không gian cho một con trỏ

Các allocatecâu lệnh cho phép bạn cấp phát không gian cho một đối tượng con trỏ. Ví dụ -

program pointerExample
implicit none

   integer, pointer :: p1
   allocate(p1)
   
   p1 = 1
   Print *, p1
   
   p1 = p1 + 4
   Print *, p1
   
end program pointerExample

Khi đoạn mã trên được biên dịch và thực thi, nó tạo ra kết quả sau:

1
5

Bạn nên làm trống không gian lưu trữ được phân bổ bằng cách deallocate tuyên bố khi nó không còn được yêu cầu và tránh tích tụ không gian bộ nhớ không sử dụng và không sử dụng được.

Mục tiêu và Hiệp hội

Mục tiêu là một biến bình thường khác, với không gian dành riêng cho nó. Một biến mục tiêu phải được khai báo vớitarget thuộc tính.

Bạn kết hợp một biến con trỏ với một biến đích bằng cách sử dụng toán tử kết hợp (=>).

Hãy để chúng tôi viết lại ví dụ trước, để chứng minh khái niệm -

program pointerExample
implicit none

   integer, pointer :: p1
   integer, target :: t1 
   
   p1=>t1
   p1 = 1
   
   Print *, p1
   Print *, t1
   
   p1 = p1 + 4
   
   Print *, p1
   Print *, t1
   
   t1 = 8
   
   Print *, p1
   Print *, t1
   
end program pointerExample

Khi đoạn mã trên được biên dịch và thực thi, nó tạo ra kết quả sau:

1
1
5
5
8
8

Một con trỏ có thể là -

  • Undefined
  • Associated
  • Disassociated

Trong chương trình trên, chúng tôi có associatedcon trỏ p1, với mục tiêu t1, sử dụng toán tử =>. Hàm được liên kết, kiểm tra trạng thái liên kết của con trỏ.

Các nullify câu lệnh tách một con trỏ khỏi mục tiêu.

Nullify không làm trống các mục tiêu vì có thể có nhiều hơn một con trỏ trỏ đến cùng một mục tiêu. Tuy nhiên, việc làm trống con trỏ cũng đồng nghĩa với việc vô hiệu hóa.

ví dụ 1

Ví dụ sau minh họa các khái niệm -

program pointerExample
implicit none

   integer, pointer :: p1
   integer, target :: t1 
   integer, target :: t2
   
   p1=>t1
   p1 = 1
   
   Print *, p1
   Print *, t1
   
   p1 = p1 + 4
   Print *, p1
   Print *, t1
   
   t1 = 8
   Print *, p1
   Print *, t1
   
   nullify(p1)
   Print *, t1
   
   p1=>t2
   Print *, associated(p1)
   Print*, associated(p1, t1)
   Print*, associated(p1, t2)
   
   !what is the value of p1 at present
   Print *, p1
   Print *, t2
   
   p1 = 10
   Print *, p1
   Print *, t2
   
end program pointerExample

Khi đoạn mã trên được biên dịch và thực thi, nó tạo ra kết quả sau:

1
1
5
5
8
8
8
T
F
T
0
0
10
10

Xin lưu ý rằng mỗi lần bạn chạy mã, địa chỉ bộ nhớ sẽ khác nhau.

Ví dụ 2

program pointerExample
implicit none

   integer, pointer :: a, b
   integer, target :: t
   integer :: n
   
   t = 1
   a => t
   t = 2
   b => t
   n = a + b
   
   Print *, a, b, t, n 
   
end program pointerExample

Khi đoạn mã trên được biên dịch và thực thi, nó tạo ra kết quả sau:

2  2  2  4