Fortran - พอยน์เตอร์

ในภาษาโปรแกรมส่วนใหญ่ตัวแปรตัวชี้จะเก็บที่อยู่หน่วยความจำของวัตถุ อย่างไรก็ตามใน Fortran ตัวชี้เป็นวัตถุข้อมูลที่มีฟังก์ชันมากกว่าการจัดเก็บที่อยู่หน่วยความจำ ประกอบด้วยข้อมูลเพิ่มเติมเกี่ยวกับออบเจ็กต์เฉพาะเช่นประเภทอันดับขอบเขตและที่อยู่หน่วยความจำ

ตัวชี้เชื่อมโยงกับเป้าหมายโดยการจัดสรรหรือการกำหนดตัวชี้

การประกาศตัวแปรตัวชี้

ตัวแปรตัวชี้ถูกประกาศด้วยแอตทริบิวต์ตัวชี้

ตัวอย่างต่อไปนี้แสดงการประกาศตัวแปรตัวชี้ -

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

ตัวชี้สามารถชี้ไปที่ -

  • พื้นที่ของหน่วยความจำที่จัดสรรแบบไดนามิก

  • ออบเจ็กต์ข้อมูลประเภทเดียวกับตัวชี้ที่มี target แอตทริบิวต์

การจัดสรรพื้นที่สำหรับตัวชี้

allocateคำสั่งอนุญาตให้คุณจัดสรรพื้นที่สำหรับวัตถุตัวชี้ ตัวอย่างเช่น -

program pointerExample
implicit none

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

เมื่อโค้ดด้านบนถูกคอมไพล์และเรียกใช้งานจะให้ผลลัพธ์ดังนี้ -

1
5

คุณควรล้างพื้นที่เก็บข้อมูลที่จัดสรรโดยไฟล์ deallocate เมื่อไม่จำเป็นต้องใช้อีกต่อไปและหลีกเลี่ยงการสะสมของพื้นที่หน่วยความจำที่ไม่ได้ใช้และใช้ไม่ได้

เป้าหมายและความสัมพันธ์

เป้าหมายเป็นตัวแปรปกติอีกตัวหนึ่งโดยมีพื้นที่ว่างไว้สำหรับมัน ต้องประกาศตัวแปรเป้าหมายด้วยtarget แอตทริบิวต์

คุณเชื่อมโยงตัวแปรตัวชี้กับตัวแปรเป้าหมายโดยใช้ตัวดำเนินการเชื่อมโยง (=>)

ให้เราเขียนตัวอย่างก่อนหน้านี้ใหม่เพื่อแสดงแนวคิด -

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

เมื่อโค้ดด้านบนถูกคอมไพล์และเรียกใช้งานจะให้ผลลัพธ์ดังนี้ -

1
1
5
5
8
8

ตัวชี้สามารถ -

  • Undefined
  • Associated
  • Disassociated

ในโปรแกรมข้างต้นเรามี associatedตัวชี้ p1 กับเป้าหมาย t1 โดยใช้ตัวดำเนินการ => ฟังก์ชันที่เกี่ยวข้องทดสอบสถานะการเชื่อมโยงของตัวชี้

nullify คำสั่งยกเลิกการเชื่อมโยงตัวชี้จากเป้าหมาย

Nullify ไม่ทำให้เป้าหมายว่างเปล่าเนื่องจากอาจมีตัวชี้มากกว่าหนึ่งตัวชี้ไปที่เป้าหมายเดียวกัน อย่างไรก็ตามการล้างตัวชี้ยังหมายถึงการทำให้เป็นโมฆะด้วย

ตัวอย่าง 1

ตัวอย่างต่อไปนี้แสดงให้เห็นถึงแนวคิด -

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

เมื่อโค้ดด้านบนถูกคอมไพล์และเรียกใช้งานจะให้ผลลัพธ์ดังนี้ -

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

โปรดทราบว่าทุกครั้งที่คุณเรียกใช้รหัสที่อยู่หน่วยความจำจะแตกต่างกัน

ตัวอย่าง 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

เมื่อโค้ดด้านบนถูกคอมไพล์และเรียกใช้งานจะให้ผลลัพธ์ดังนี้ -

2  2  2  4