pointer c/c++

17 Jul 2016,
Share: 

pointer เป็นชนิดข้อมูลประเภทหนึ่งที่สร้างจากชนิดข้อมูลแบบพื้นฐานทั่วไป โดยชนิดข้อมูลแบบ pointer จะแตกต่างกับชนิดข้อมูลพื้นฐานตรงที่ชนิดข้อมูลแบบพื้นฐานจะเก็บและดึงข้อมูลจากตัวแปรโดยตรง แต่ชนิดข้อมูลแบบ pointer จะเก็บค่าที่อยู่(Address) ของตัวแปรอื่น และใช้ค่าที่อยู่นี้อ้างอิงไปยังข้อมูลที่เก็บอยู่ในตัวแปรนั้นอีกที เพื่อทําการเก็บและดึงข้อมูลจากตัวแปรนั้นอีกที

pointer เป็นตัวแปรชนิดหนึ่งดังนั้น มันจึงมีที่อยู่ในหนวยความจํา(Memory) เหมือนกับตัวแปรอื่นๆทั่วไป โดยตัวของ pointer นั้นหน้าที่หลักของมันคือ ชี้ไปยัง address ใดๆ เพื่อจัดการกับข้อมูลที่เก็บอยู่ใน address นั้นๆ ถ้าประกาศตัวแปร int a = 3; จะหมายถึง สร้างตัวแปรชนิด integer ชื่อว่า a และเก็บจํานวนเต็ม 3 ไว้ในตัวมัน แต่หากประกาศตัวแปร pointer ขึ้นมาใช้งาน จะกําหนดค่าเลขจํานวนเต็ม 3 ให้กับตัวแปรโดยตรงไม่ได้ เพราะอย่างที่กล่าวมาข้างต้นตัวแปร pointer เป็นเพียงแค่ตัวชี้ ดังนั้นเราจึงต้องกําหนด pointer ชี้ไปยังตัวแปร a ก่อน pointer จึงจะมีข้อมูลเท่ากับ 3

การประกาศตัวแปร pointer ขึ้นใช้งาน

รูปแบบการประกาศตัวแปร pointer คือ

ชนิดข้อมูล *ชื่อตัวแปรpointer
  • ชนิดข้อมูล คือ ชนิดของข้อมูลที่ pointer จะชี้ หรืออ้างอิง
  • ชื่อตัวแปรpointer คือ ชื่อของตัวแปร pointer ที่ต้องการ

ตัวอย่าง

int *p; //คือประกาศตัวแปร p เป็น pointer มีชนิดข้อมูลเป็นจํานวนเต็ม
char *p1; //คือประกาศตัวแปร p1 เป็น pointer มีชนิดข้อมูลเป็นตัวอักษร
float *p2; //คือประกาศตัวแปร p2 เป็น pointer มีชนิดข้อมูลเป็นเลขจํานวนเต็ม

หากประกาศตัวแปร pointer เป็นชนิดข้อมูลประเภทใดแล้ว ตัวแปร pointer จะต้องชี้ไปยังข้อมูลประเภทนั้น เช่น

int a = 100;
int *p1;
char b = 'Q'
char *p2;

p1 = &a;
p2 = &b;

การกําหนดค่าเริ่มต้นให้กับตัวแปร pointer

การประกาศตัวแปรขึ้นใช้งานนั้น ไม่ว่าจะเป็นการประกาศตัวแปรแบบพื้นฐาน ตัวแปรประเภทอาร์เรย์หรือตัวแปร pointer ก็ตาม ถ้าไม่ทําการกําหนดค่าเริ่มต้นให้กับตัวแปรเหล่านี้ ค่าที่ตัวแปรเก็บไว้ก็จะเก็บเป็นค่าขยะ ซึ่งไม่สามารถคาดเดาได้ว่าเป็นค่าอะไร เช่นถ้าประกาศ int *p; โดยไม่กําหนดค่าเริ่มต้นให้กับตัวมัน จะพบว่า p เก็บค่า address อะไรสักอย่างที่ไม่มีความหมาย คือเป็นค่าขยะนั่นเอง ดังนั้นเมื่อประกาศใช้งานตัวแปร pointer แล้วจําเป็นจะต้องกําหนดค่าเริ่มต้นให้กับมันด้วย หรือให้มันชี้ไปยัง address 0, NULL เช่น

int a = 20;
int *p1 = &a;

int *p2 = 0;
int *p3 = NULL;

สัญลักษณ์ที่ทําคัญในการทํางานกับ pointer

pointer มีสัญลักษณ์สําคัญอยู่ 2 ตัวคือ

  • สัญลักษณ์ & หมายถึง ดึงเอาค่า address ของตัวแปรใดๆออกมา เช่นถ้าต้องการจะดึงค่า address ของตัวแปร a ออกมาสามารถเขียนได้ดังนี้ &a
  • สัญลักษณ์ * หมายถึง ดึงเอาค่าข้อมูลที่แท้จริงที่ pointer นั้นๆชี้ไป

ตัวอย่างการใช้งาน pointer

#include <stdio.h>

int main () {

   int  a = 20;   //ประกาศตัวแปร int แล้วกําหนดค่า 20
   int  *p;       //สร้างตัวแปร pointer ประเภท int

   p = &a;  //กําหนดให้ pointer p ชี้ไปยัง address ของตัวแปร a

   //แสดงผล address ของตัวแปร a
   printf("Address of a variable: %x\n", &a  );

   //แสดงผล address ที่ pointer ชี้ไป ซึ่งก็คือ address ของตัวแปร a
   printf("Address stored in p variable: %x\n", p);

   //แสดงผลข้อมูลที่ pointer ชี้ไป
   printf("Value of *p variable: %d\n", *p);

   return 0;
}

Suggestion blogs

ค่าเฉลี่ยกําลังสอง RMS Root Mean Square

ค่าเฉลี่ยกําลังสอง RMS Root Mean Square คืออะไรค่าเฉลี่ยกําลังสอง RMS Root Mean Square เป็นการวัดทางสถิติของปริมาณที่มีการเปลี่ยนแปลงอยู่ตลอดเวลา ยกตัวอย่างเช่น กรณีที่เป็นการหาค่าเฉลี่ยปกติจะนําค่าที่สูงบ้างตํ่าบ้างมาบวกกันแล้วหารด้วยจํานวนของข้อมูลที่นํามาบวกกัน แต่เมื่อใดที่เราใช้วิธีการดังกล่าว มาหาค่าเฉลี่ยของไฟฟ้ากระแสสลับจะเกิดปัญหาครับ เพราะว่า ไฟฟ้ากระแสสลับจะมีทั้งช่วงบวกและลบ

Auto login on raspberry pi

Auto login on raspberry pi ถ้าเราใช้ debian บน raspberry pi ในโหมด gui ระบบจะ login user: pi ให้เราโดยอัตโนมัติ แต่ถ้าเราต้องการให้ login ด้วย user อื่นๆ ก็สามารถทำได้โดย แก้ไข ไฟล์ "/etc/lightdm/lightdm.conf" ด้วยคำสั่งนี้

Flutter EP.4 Project structure file flutter

สวัสดีครับ ใน EP.3 เราได้เรียนรู้ Widget ใน Flutter กันไปแล้ว สําหรับเนื้อหาต่อไปในบทความนี้จะเป็นเรื่องโครงสร้างไฟล์ใน Flutter ว่ามีอะไรบ้าง แต่ละไฟล์คืออะไร เราจะได้มาเรียนรู้กันครับ


Copyright © 2019 - 2025 thiti.dev |  v1.54.0 |  Privacy policy | 

Build with ❤️ and Astro.

Github profile   Linkedin profile   Instagram   X profile   Nostr   Youtube channel   Telegram   Email contact   วงแหวนเว็บ