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

Transfer file ระหว่าง server ด้วย scp ใน ubuntu

วิธีใช้ scp ใน ubuntuถ้าต้องการจะ copy file จาก server A ไปยัง server B สามารถใช้คําสั่ง scp โดยรูปแบบการใช้คือ

ซ่อม Hard disk WD My Passport USB เสีย (แปลงจาก USB เป็น SATA)

Hard disk WD My Passport เป็นรุ่นที่ตัวของ Hard disk เป็น Port USB มาบนบอร์ดเลย แทนที่จะเป็น SATA เหมือน Hard disk ทั่วไป เมื่อ USB เสียเราจะไม่สามารถนําข้อมูลออกมาได้ ซึ่งจะต่างจาก Hard disk ทั่วๆไป ที่สามารถถอดตัว Hard disk มาจัมพ์กับ Computer ผ่านทางสาย SATA เพื่อนําข้อมูลออกมาได้

เริ่มต้นใช้งาน NodeMcu ESP8266 ด้วย Arduino IDE

ในบทความที่แล้วเราได้ทําความรู้จักกับ ESP8266 กันแล้ว ในบทความนี้เราจะมาพูดถึงวิธีการใช้งาน ESP8266 ด้วย Arduino IDE โดยจะใช้ ภาษา c/c++ ในการเขียนโปรแกรม


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

Build with ❤️ and Astro.

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