Skip to content

C-2.1 Pointers

ทุกตัวแปรมี 3 สิ่ง: ชื่อ, ค่า, และ address — pointer คือตัวแปรที่เก็บ address ของตัวแปรอื่น ฟังดูนามธรรม แต่นี่คือสิ่งที่ซ่อนอยู่ใต้ทุก reference, foreign key, และ cell reference ที่คุณเคยใช้

ทำไมต้องรู้เรื่อง Pointer?

Section titled “ทำไมต้องรู้เรื่อง Pointer?”

ลองคิดแบบนี้ — คุณมีหนังสือ 1 เล่มอยู่บนชั้น:

  • ค่า = เนื้อหาในหนังสือ
  • Address = ตำแหน่งบนชั้น (แถว 3, ช่อง 7)
  • Pointer = กระดาษโน้ตที่เขียนว่า “ดูแถว 3 ช่อง 7”

แทนที่จะ copy หนังสือทั้งเล่ม คุณแค่ส่งกระดาษโน้ต — นี่คือ pointer

& และ * — สอง operators ที่สำคัญที่สุด

Section titled “& และ * — สอง operators ที่สำคัญที่สุด”
Operatorชื่อทำอะไรอ่านว่า
&xaddress-ofให้ address ของ x”address ของ x”
*pdereferenceให้ค่าที่ address ที่ p ชี้ไป”ค่าที่ p ชี้ไป”
#include <stdio.h>
int main() {
int x = 42;
int *p = &x; // p เก็บ address ของ x
printf("=== ตัวแปร x ===\n");
printf("ค่า (x): %d\n", x); // 42
printf("address (&x): %p\n", (void*)&x); // 0x7ffc... (address จริง)
printf("size: %zu bytes\n", sizeof(x)); // 4
printf("\n=== pointer p ===\n");
printf("ค่าของ p (address ที่ชี้ไป): %p\n", (void*)p); // address ของ x
printf("ค่าที่ p ชี้ไป (*p): %d\n", *p); // 42
printf("size ของ pointer: %zu bytes\n", sizeof(p)); // 8
return 0;
}

ผลลัพธ์ (address จะต่างในแต่ละเครื่อง):

=== ตัวแปร x ===
ค่า (x): 42
address (&x): 0x7ffc8a1b2c3d
size: 4 bytes
=== pointer p ===
ค่าของ p (address ที่ชี้ไป): 0x7ffc8a1b2c3d
ค่าที่ p ชี้ไป (*p): 42
size ของ pointer: 8 bytes

เปลี่ยนค่าผ่าน Pointer

Section titled “เปลี่ยนค่าผ่าน Pointer”

นี่คือพลังที่แท้จริงของ pointer — คุณเปลี่ยนค่าของตัวแปรโดย ไม่ต้องแตะตัวแปรตรงๆ:

#include <stdio.h>
int main() {
int x = 42;
int *p = &x;
printf("Before: x = %d\n", x); // 42
*p = 100; // เปลี่ยนค่าที่ p ชี้ไป = เปลี่ยน x!
printf("After: x = %d\n", x); // 100
printf(" *p = %d\n", *p); // 100
// x และ *p คือสิ่งเดียวกัน!
printf("\n&x = %p\n", (void*)&x);
printf("p = %p\n", (void*)p);
printf("(same address!)\n");
return 0;
}

ผลลัพธ์:

Before: x = 42
After: x = 100
*p = 100
&x = 0x7ffc8a1b2c3d
p = 0x7ffc8a1b2c3d
(same address!)

สิ่งนี้เทียบเท่ากับ: เปลี่ยนค่าใน cell A1 แล้ว cell B1 (ที่มี =A1) เปลี่ยนตาม

string ใน C จริงๆ แล้วคือ pointer ไปหา char ตัวแรก ของ array:

#include <stdio.h>
int main() {
char greeting[] = "HELLO";
char *s = greeting; // s ชี้ไปที่ตัวอักษรตัวแรก
printf("s points to: %p\n", (void*)s);
printf("*s = '%c' (ตัวแรก)\n", *s); // H
printf("*(s+1) = '%c'\n", *(s+1)); // E
printf("*(s+4) = '%c'\n", *(s+4)); // O
// เดินผ่าน string ด้วย pointer
printf("\n--- Walk through string ---\n");
while (*s != '\0') {
printf("address %p '%c' (ASCII %d)\n", (void*)s, *s, *s);
s++; // เลื่อน pointer ไปตัวถัดไป
}
printf("address %p '\\0' (null terminator)\n", (void*)s);
return 0;
}

ผลลัพธ์:

s points to: 0x7ffc8a1b2c30
*s = 'H' (ตัวแรก)
*(s+1) = 'E'
*(s+4) = 'O'
--- Walk through string ---
address 0x7ffc8a1b2c30 'H' (ASCII 72)
address 0x7ffc8a1b2c31 'E' (ASCII 69)
address 0x7ffc8a1b2c32 'L' (ASCII 76)
address 0x7ffc8a1b2c33 'L' (ASCII 76)
address 0x7ffc8a1b2c34 'O' (ASCII 79)
address 0x7ffc8a1b2c35 '\0' (null terminator)

สังเกต address เพิ่มขึ้นทีละ 1 — เพราะแต่ละ char ใช้ 1 byte ดังนั้น byte ถัดไปอยู่ที่ address ถัดไปพอดี

char *s = "hello" คือ pattern ที่คุณจะเห็นบ่อยที่สุดใน C — มันหมายความว่า “s เก็บ address ของตัวอักษรตัวแรก” ตัวที่เหลือเรียงต่อกันใน memory

OperationCSheetsPythonSQL
สร้าง referenceint *p = &x=A1y = xREFERENCES users(id)
อ่านค่าจาก reference*pค่าแสดงอัตโนมัติใช้ y ตรงๆJOIN
ดู address&x / %pชื่อ cell “A1”id(x)primary key