C programming ภาษาซี เรื่อง pointer

  • warning: realpath() [function.realpath]: SAFE MODE Restriction in effect. The script whose uid is 1005 is not allowed to access /tmp owned by uid 0 in /var/www/sites/sugree/codenone.com/subdomains/www/html/includes/file.inc on line 190.
  • warning: realpath() [function.realpath]: SAFE MODE Restriction in effect. The script whose uid is 1005 is not allowed to access /tmp owned by uid 0 in /var/www/sites/sugree/codenone.com/subdomains/www/html/includes/file.inc on line 190.

C programming ภาษาซี

คือเรื่อง pointer

ตัว * กับ & มันต่างกันยังไงอะ เช่น *a , &a

ช่วยตอบหน่อยอะ

sugree's picture
  • * ให้ value
  • & ให้ address

ไม่เข้าใจอะ * ให้ค่ายังไง , & ให้ address ยังไง ช่วยยกตัวอย่างหน่อย

สมมุติว่า memory มีอยู่ 8 ช่อง.
และมีลักษณะแบบนี้

  • ช่องที่ 0 เก็บค่า 100
  • ช่องที่ 1 เก็บค่า 200
  • ช่องที่ 2 เก็บค่า 300
  • ช่องที่ 3 เก็บค่า 6
  • ช่องที่ 4 เก็บค่า 400
  • ช่องที่ 5 เก็บค่า 500
  • ช่องที่ 6 เก็บค่า 600
  • ช่องที่ 7 เก็บค่า 700

ตัวแปรก็คือช่องช่องหนึ่ง ... สมมุติว่า a แทนตัวแปรช่องที่ 3
ค่าของ a (เฉยๆ ไม่ใส่อะไร) คือ 6 (ดูช่องที่ 3 ประกอบ)
ค่าของ &a คือ 3 (เลขที่ของช่อง)
ค่าของ *a คือ 600 (เอาค่าในช่องที่ 3 มาดูก็คือ 6. แล้วก็ดูค่าในช่องที่ 6 ได้ 600)

ไม่รู้อธิบายแบบนี้ถูกเปล่านะ :-P.

สมมติเราประกาศดังนี้

int a = 5, b = 4;
int* p;
p = &a;

หมายความว่า บรรทัดแรกประกาศตัวแปรประเภท int ชื่อ a, b ซึ่งการกระทำนี้ จะมีการไปจองตำแหน่งในหน่วยความจำแล้วจึงนำค่า 5, 4 ไปใส่ในที่แห่งนั้น (ตามลำดับ)
บรรทัดสองประกาศตัวแปรประเภท pointer to int ชื่อ p ซึ่งการกระทำนี้ จะมีการไปจองตำแหน่งในหน่วยความจำที่มีขนาด x bytes (ขึ้นกับชนิด CPU/การอ้างอิงตำแหน่งหน่วยความจำ)
บรรทัดสามสั่งให้นำ address of a ไปใส่ยังตำแหน่งของ p หมายความว่าให้ pointer ชี้ไปที่ a (ตามนิยามของ pointer)

printf("%d %d\n", a, *p);
a++;
b = (*p)++;
printf("%d %d %d\n", a, b, *p);

ผลลัพธ์ที่ได้ในบรรทัดแรก คือ 5 5
ส่วนบรรทัดที่สอง คือ 7 6 7

เหตุผลเพราะ b แค่นำค่าที่ได้จากการ dereference p (คือค่าในตำแหน่งหน่วยความจำของ a) แต่เราทำการเปลี่ยนค่าของมันภายหลังจากคำสั่ง assignment จึงได้ค่าดังข้างต้น

ปัญหาที่อาจจะพบคือ แล้วเราจะจัดการกับพวก int** p หรือ int*** p อย่างไร? ตามที่เข้าใจคือ * คือ 1 ตัว ** คือ 1 ก้อน (หลายตัว) และ *** คือ หลายก้อน (ก้อนละหลายตัว) ฯลฯ

และเนื่องจากการที่มี pointer ก็จะมีอีกประเด็นที่น่าสนใจคือ pointer arithmetic ก็คือ สมมติเราทำ p + 1 หมายความว่าบล็อกถัดไปจากตำแหน่ง p หนึ่งบล็อก ถ้ามองว่า p ชี้ไปยังตำแหน่งบน array การสั่ง p + 1 ก็คือการชี้ไปยังช่องใน array ช่องถัดไปนั่นเอง ถ้าจะ dereference ก็ใส่ * นำหน้าเช่นเดิม เช่น *(p + 1)

vee อธิบายถูกครับ, ezy ก็ถูกต้อง

ย้าย Codenone

ประกาศย้าย Codenone ไปใช้ Forum ของ Blognone แทนครับ ตามไปตั้งกระทู้ต่อได้ที่ Codenone Forum (รายละเอียดอ่านจากกระทู้ ย้าย Codenone ไปรวมกับ Blognone)

กระทู้เก่าๆ จะย้ายตามไปในภายหลัง ตอนนี้ปิดการโพสต์กระทู้ไว้ เหลือไว้เฉพาะอ้างอิงเท่านั้น