ตัวแปรอ้างอิง (Reference Variable)
Reference คือชื่อเรียกทางเลือก (alias) ของตัวแปรที่มีอยู่แล้ว ไม่สามารถเปลี่ยนไปอ้างอิงตัวแปรอื่นได้ และต้อง初始化 (initialize) ตอนประกาศ ไม่สามารถเป็น NULL ได้ ใช้ตัวดำเนินการ & ในการประกาศ
ไวยากรณ์
datatype variable_name; // ประกาศตัวแปร
datatype& refer_var = variable_name; // ประกาศ reference
ตัวอย่าง
#include <iostream>
using namespace std;
int main() {
int a = 8;
int& b = a; // b เป็น reference ของ a
cout << "The variable a: " << a;
cout << "\nThe reference variable b: " << b;
return 0;
}
ผลลัพธ์
The variable a: 8
The reference variable b: 8
Pointers (ตัวชี้)
Pointer คือตัวแปรที่เก็บที่อยู่หน่วยความจำของตัวแปรอื่น เมื่อจัดสรรหน่วยความจำให้ตัวแปร Pointer จะชี้ไปที่ที่อยู่นั้น ใช้ตัวดำเนินการ * ในการประกาศ
ไวยากรณ์
datatype *variable_name;
ตัวอย่าง
#include <stdio.h>
int main() {
int a = 8;
int *ptr;
ptr = &a;
printf("Value of variable: %d\n", a);
printf("Address of variable: %p\n", (void*)ptr);
printf("Value pointer variable: %d\n", *ptr);
return 0;
}
ผลลัพธ์
Value of variable: 8
Address of variable: 0x7ffeefbff5ac
Value pointer variable: 8
ความแตกต่างหลักและเมื่อไหร่ควรใช้แต่ละอย่าง
| คุณสมบัติ | Reference | Pointer |
|---|---|---|
| การ初始化 | บังคับตอนประกาศ | สามารถประกาศก่อน 初始化 ภายหลัง |
| การเปลี่ยนเป้าหมาย | ไม่ได้ (ผูกติดตลอดชีวิต) | ได้ (ชี้ไปตัวแปรอื่นได้) |
| ค่า NULL | ไม่สามารถเป็น NULL ได้ | สามารถเป็น NULL ได้ |
| Syntax การเข้าถึง | เหมือนตัวแปรทั่วไป (ref) | ต้อง dereference (*ptr) |
| ค่าใช้จ่ายหน่วยความจำ | ไม่มี overhead เพิ่ม | ใช้พื้นที่เก็บที่อยู่ (4/8 ไบต์) |
แนวทางเลือกใช้งาน
- ใช้ Reference เมื่อ: ต้องการ alias เรียบง่าย ไม่ต้องการเปลี่ยนเป้าหมาย ใช้ใน parameter passing (pass-by-reference) เพื่อหลีกเลี่ยงการคัดลอก
- ใช้ Pointer เมื่อ: ต้องการจัดการหน่วยความจำแบบไดนามิก ต้องการ nullable type ต้องการ pointer arithmetic ต้องการสร้างโครงสร้างข้อมูลเช่น linked list, tree