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