C++ พอยน์เตอร์พร้อมตัวอย่าง
พอยน์เตอร์คืออะไร?
In C++ตัวชี้หมายถึงตัวแปรที่เก็บที่อยู่ของตัวแปรอื่น เช่นเดียวกับตัวแปรทั่วไป พอยน์เตอร์มีชนิดข้อมูล ตัวอย่างเช่น ตัวชี้ประเภทจำนวนเต็มสามารถเก็บที่อยู่ของตัวแปรประเภทจำนวนเต็มได้ ตัวชี้ประเภทอักขระสามารถเก็บที่อยู่ของตัวแปรประเภทอักขระได้
คุณควรเห็นตัวชี้เป็นตัวแทนเชิงสัญลักษณ์ของที่อยู่หน่วยความจำ ด้วยพอยน์เตอร์ โปรแกรมสามารถจำลองการโทรโดยการอ้างอิงได้ พวกเขายังสามารถสร้างและจัดการโครงสร้างข้อมูลแบบไดนามิกได้ ใน C++ตัวแปรตัวชี้หมายถึงตัวแปรที่ชี้ไปยังที่อยู่เฉพาะในหน่วยความจำที่ชี้โดยตัวแปรอื่น
ที่อยู่ใน C++
เข้าใจไหม C++ พอยน์เตอร์ คุณต้องเข้าใจว่าคอมพิวเตอร์เก็บข้อมูลอย่างไร
เมื่อคุณสร้างตัวแปรใน C++ โปรแกรมจะกำหนดพื้นที่หน่วยความจำคอมพิวเตอร์บางส่วน ค่าของตัวแปรนี้จะถูกจัดเก็บไว้ในตำแหน่งที่กำหนด
หากต้องการทราบตำแหน่งในหน่วยความจำคอมพิวเตอร์ที่จัดเก็บข้อมูล C++ ให้ & ตัวดำเนินการ (การอ้างอิง) ตัวดำเนินการส่งคืนที่อยู่ที่ตัวแปรครอบครอง
ตัวอย่างเช่น ถ้า x เป็นตัวแปร &x จะส่งกลับที่อยู่ของตัวแปร
ไวยากรณ์การประกาศตัวชี้
คำประกาศของ C++ ใช้รูปแบบประโยคต่อไปนี้:
datatype *variable_name;
- ประเภทข้อมูลเป็นประเภทพื้นฐานของตัวชี้ซึ่งจะต้องถูกต้อง C++ ประเภทข้อมูล.
- Variable_name ควรเป็นชื่อของตัวแปรตัวชี้
- เครื่องหมายดอกจันที่ใช้ด้านบนสำหรับการประกาศตัวชี้จะคล้ายกับเครื่องหมายดอกจันที่ใช้ในการดำเนินการคูณ เครื่องหมายดอกจันจะทำหน้าที่ทำเครื่องหมายตัวแปรเป็นตัวชี้
นี่คือตัวอย่างของการประกาศพอยน์เตอร์ที่ถูกต้อง C++:
int *x; // a pointer to integer double *x; // a pointer to double float *x; // a pointer to float char *ch // a pointer to a character
ตัวดำเนินการอ้างอิง (&) และตัวดำเนินการ Deference (*)
ตัวดำเนินการอ้างอิง (&) ส่งคืนที่อยู่ของตัวแปร
ตัวดำเนินการยกเลิกการอ้างอิง (*) ช่วยให้เราได้รับค่าที่ถูกจัดเก็บไว้ในที่อยู่หน่วยความจำ
ตัวอย่างเช่น:
หากเรามีตัวแปรชื่อ num ให้เก็บไว้ในที่อยู่ 0x234 และเก็บค่า 28
ตัวดำเนินการอ้างอิง (&) จะส่งกลับ 0x234
ตัวดำเนินการยกเลิกการอ้างอิง (*) จะคืนค่า 5
1 ตัวอย่าง:
#include <iostream> using namespace std; int main() { int x = 27; int *ip; ip = &x; cout << "Value of x is : "; cout << x << endl; cout << "Value of ip is : "; cout << ip<< endl; cout << "Value of *ip is : "; cout << *ip << endl; return 0; }
Output:
มันทำงานอย่างไร:
นี่คือภาพหน้าจอของรหัส:
คำอธิบายรหัส:
- นำเข้าไฟล์ส่วนหัว iostream สิ่งนี้จะช่วยให้เราสามารถใช้ฟังก์ชั่นที่กำหนดไว้ในไฟล์ส่วนหัวโดยไม่ได้รับข้อผิดพลาด
- รวมเนมสเปซมาตรฐานเพื่อใช้คลาสโดยไม่ต้องเรียกมัน
- เรียกใช้ฟังก์ชัน main() ควรเพิ่มตรรกะของโปรแกรมภายในเนื้อหาของฟังก์ชันนี้ { เป็นเครื่องหมายจุดเริ่มต้นของเนื้อหาของฟังก์ชัน
- ประกาศตัวแปรจำนวนเต็ม x และกำหนดค่าเป็น 27
- ประกาศตัวแปรพอยน์เตอร์ *ip
- เก็บที่อยู่ของตัวแปร x ไว้ในตัวแปรตัวชี้
- พิมพ์ข้อความบนคอนโซล
- พิมพ์ค่าของตัวแปร x บนหน้าจอ
- พิมพ์ข้อความบนคอนโซล
- พิมพ์ที่อยู่ของตัวแปร x ค่าของที่อยู่ถูกเก็บไว้ในตัวแปร ip
- พิมพ์ข้อความบนคอนโซล
- พิมพ์ค่าที่เก็บไว้ตามที่อยู่ของตัวชี้
- โปรแกรมควรคืนค่าเมื่อดำเนินการสำเร็จ
- ส่วนท้ายของฟังก์ชัน main()
พอยน์เตอร์และอาร์เรย์
อาร์เรย์และพอยน์เตอร์ทำงานตามแนวคิดที่เกี่ยวข้อง มีหลายสิ่งที่ควรทราบเมื่อทำงานกับอาร์เรย์ที่มีพอยน์เตอร์ ชื่ออาร์เรย์นั้นแสดงถึงที่อยู่พื้นฐานของอาร์เรย์ ซึ่งหมายความว่าในการกำหนดที่อยู่ของอาร์เรย์ให้กับตัวชี้ คุณไม่ควรใช้เครื่องหมายแอมเพอร์แซนด์ (&)
ตัวอย่างเช่น:
p = arr;
ข้างต้นถูกต้องเนื่องจาก arr แสดงถึงที่อยู่ของอาร์เรย์ นี่เป็นอีกตัวอย่างหนึ่ง:
p = &arr;
ข้างต้นไม่ถูกต้อง
เราสามารถแปลงอาร์เรย์เป็นตัวชี้โดยปริยายได้ ตัวอย่างเช่น:
int arr [20]; int * ip;
ด้านล่างนี้เป็นการดำเนินการที่ถูกต้อง:
ip = arr;
หลังจากการประกาศข้างต้น ip และ arr จะเท่ากัน และจะแชร์คุณสมบัติกัน อย่างไรก็ตาม สามารถกำหนดที่อยู่อื่นให้กับ ip ได้ แต่เราไม่สามารถกำหนดสิ่งใดให้กับ arr ได้
2 ตัวอย่าง:
ตัวอย่างนี้แสดงวิธีการสำรวจอาร์เรย์โดยใช้พอยน์เตอร์:
#include <iostream> using namespace std; int main() { int *ip; int arr[] = { 10, 34, 13, 76, 5, 46 }; ip = arr; for (int x = 0; x < 6; x++) { cout << *ip << endl; ip++; } return 0; }
Output:
นี่คือภาพหน้าจอของรหัส:
คำอธิบายรหัส:
- ประกาศตัวแปรตัวชี้จำนวนเต็ม IP
- ประกาศอาร์เรย์ชื่อ arr และเก็บจำนวนเต็ม 6 ตัวไว้
- กำหนด arr ให้กับ ip ip และ arr จะเท่ากัน
- สร้างสำหรับการวนซ้ำ ตัวแปรลูป x ถูกสร้างขึ้นเพื่อวนซ้ำองค์ประกอบอาร์เรย์ตั้งแต่ดัชนี 0 ถึง 5
- พิมพ์ค่าที่เก็บไว้ตามที่อยู่ของ IP ของตัวชี้ จะมีการส่งคืนหนึ่งค่าต่อการวนซ้ำ และจะทำซ้ำทั้งหมด 6 ครั้ง จุดสิ้นสุดคือ a C++ คำสำคัญที่หมายถึงบรรทัดสุดท้าย การดำเนินการนี้ช่วยให้คุณสามารถย้ายเคอร์เซอร์ไปยังบรรทัดถัดไปหลังจากพิมพ์แต่ละค่าแล้ว แต่ละค่าจะถูกพิมพ์แยกบรรทัด
- เพื่อย้ายตัวชี้ไปยังตำแหน่ง int ถัดไปหลังจากการวนซ้ำทุกครั้ง
- สิ้นสุดการวนซ้ำ
- โปรแกรมจะต้องส่งคืนบางสิ่งเมื่อดำเนินการสำเร็จ
- จุดสิ้นสุดของเนื้อหาฟังก์ชัน main()
ตัวชี้ NULL
หากไม่มีที่อยู่ที่แน่นอนที่จะกำหนด ตัวแปรตัวชี้ก็สามารถกำหนดเป็น NULL ได้ ควรทำในระหว่างการประกาศ ตัวชี้ดังกล่าวเรียกว่าตัวชี้ว่าง ค่าของมันคือศูนย์และถูกกำหนดไว้ในไลบรารีมาตรฐานหลายแห่ง เช่น iostream
3 ตัวอย่าง:
#include <iostream> using namespace std; int main() { int *ip = NULL; cout << "Value of ip is: " << ip; return 0; }
Output:
นี่คือภาพหน้าจอของรหัส:
คำอธิบายรหัส:
- ประกาศตัวแปรตัวชี้ IP และกำหนดค่าเป็น NULL
- พิมพ์ค่าของตัวแปรตัวชี้ ip ข้างข้อความบนคอนโซล
- โปรแกรมจะต้องคืนค่าเมื่อเสร็จสิ้นสำเร็จ
- ส่วนท้ายของฟังก์ชัน main()
พอยน์เตอร์ของตัวแปร
ด้วยระบบเส้นทาง C++คุณสามารถจัดการข้อมูลได้โดยตรงจากหน่วยความจำของคอมพิวเตอร์
พื้นที่หน่วยความจำสามารถกำหนดหรือกำหนดใหม่ได้ตามต้องการ สิ่งนี้เกิดขึ้นได้ด้วยตัวแปรพอยน์เตอร์
ตัวแปรตัวชี้ชี้ไปยังที่อยู่เฉพาะในหน่วยความจำของคอมพิวเตอร์ที่ตัวแปรอื่นชี้ไป
สามารถประกาศได้ดังนี้:
int *p;
หรือ
int* p;
ในตัวอย่างของคุณ เราได้ประกาศตัวแปรตัวชี้ p แล้ว
มันจะเก็บที่อยู่หน่วยความจำ
เครื่องหมายดอกจันคือตัวดำเนินการยกเลิกการอ้างอิงซึ่งหมายถึงตัวชี้ไปยัง
ตัวชี้ p ชี้ไปที่ค่าจำนวนเต็มในที่อยู่หน่วยความจำ
4 ตัวอย่าง:
#include <iostream> using namespace std; int main() { int *p, x = 30; p = &x; cout << "Value of x is: " << *p; return 0; }
Output:
นี่คือภาพหน้าจอของรหัส:
คำอธิบายรหัส:
- ประกาศตัวแปรพอยน์เตอร์ p และตัวแปร x ที่มีค่า 30
- กำหนดที่อยู่ของตัวแปร x ให้กับ p
- พิมพ์ค่าของตัวแปรตัวชี้ p ข้างข้อความบนคอนโซล
- โปรแกรมจะต้องคืนค่าเมื่อเสร็จสิ้นสำเร็จ
- ส่วนท้ายของฟังก์ชัน main()
การประยุกต์ใช้พอยน์เตอร์
ฟังก์ชั่นใน C++ สามารถส่งคืนค่าได้เพียงค่าเดียว นอกจากนี้ ตัวแปรทั้งหมดที่ประกาศไว้ในฟังก์ชันจะถูกจัดสรรในสแต็กการเรียกใช้ฟังก์ชัน ทันทีที่ฟังก์ชันส่งคืน ตัวแปรสแต็กทั้งหมดจะถูกลบทิ้ง
อาร์กิวเมนต์สำหรับฟังก์ชันจะถูกส่งผ่านค่า และการแก้ไขใดๆ ที่ทำกับตัวแปรจะไม่เปลี่ยนค่าของตัวแปรจริงที่ถูกส่งผ่าน ตัวอย่างต่อไปนี้จะช่วยอธิบายแนวคิดนี้:
5 ตัวอย่าง:
#include <iostream> using namespace std; void test(int*, int*); int main() { int a = 5, b = 5; cout << "Before changing:" << endl; cout << "a = " << a << endl; cout << "b = " << b << endl; test(&a, &b); cout << "\nAfter changing" << endl; cout << "a = " << a << endl; cout << "b = " << b << endl; return 0; } void test(int* n1, int* n2) { *n1 = 10; *n2 = 11; }
Output:
นี่คือภาพหน้าจอของรหัส:
คำอธิบายรหัส:
- สร้างต้นแบบของฟังก์ชันชื่อ test ซึ่งจะใช้พารามิเตอร์จำนวนเต็มสองตัว
- เรียกใช้ฟังก์ชัน main() เราจะเพิ่มตรรกะของโปรแกรมเข้าไปในเนื้อความของมัน
- ประกาศตัวแปรจำนวนเต็มสองตัว a และ b โดยแต่ละตัวมีค่าเท่ากับ 5
- พิมพ์ข้อความบนคอนโซล endl (บรรทัดสิ้นสุด) จะเลื่อนเคอร์เซอร์เพื่อเริ่มพิมพ์ในบรรทัดถัดไป
- พิมพ์ค่าของตัวแปร a บนคอนโซลควบคู่ไปกับข้อความอื่น endl (บรรทัดสิ้นสุด) จะเลื่อนเคอร์เซอร์เพื่อเริ่มพิมพ์ในบรรทัดถัดไป
- พิมพ์ค่าของตัวแปร b บนคอนโซลควบคู่ไปกับข้อความอื่น endl (บรรทัดสิ้นสุด) จะเลื่อนเคอร์เซอร์เพื่อเริ่มพิมพ์ในบรรทัดถัดไป
- สร้างฟังก์ชันชื่อ test() ที่จะรับที่อยู่ของตัวแปร a และ b เป็นพารามิเตอร์
- พิมพ์ข้อความบนคอนโซล \n จะสร้างบรรทัดว่างใหม่ก่อนที่จะพิมพ์ข้อความ endl (บรรทัดสิ้นสุด) จะเลื่อนเคอร์เซอร์เพื่อเริ่มพิมพ์ในบรรทัดถัดไปหลังจากพิมพ์ข้อความแล้ว
- พิมพ์ค่าของตัวแปร a บนคอนโซลควบคู่ไปกับข้อความอื่น endl (บรรทัดสิ้นสุด) จะเลื่อนเคอร์เซอร์เพื่อเริ่มพิมพ์ในบรรทัดถัดไป
- พิมพ์ค่าของตัวแปร b บนคอนโซลควบคู่ไปกับข้อความอื่น endl (บรรทัดสิ้นสุด) จะเลื่อนเคอร์เซอร์เพื่อเริ่มพิมพ์ในบรรทัดถัดไป
- โปรแกรมจะต้องคืนค่าเมื่อเสร็จสิ้นสำเร็จ
- ส่วนท้ายของฟังก์ชัน main()
- การกำหนดฟังก์ชัน test() ฟังก์ชันควรใช้ตัวแปรตัวชี้จำนวนเต็มสองตัว *n1 และ *n2
- การกำหนดตัวแปรพอยน์เตอร์ *n1 ให้เป็นค่า 10
- การกำหนดตัวแปรพอยน์เตอร์ *n2 ให้เป็นค่า 11
- ส่วนท้ายของฟังก์ชัน test()
แม้ว่าค่าใหม่จะถูกกำหนดค่าให้กับตัวแปร a และ b ภายในการทดสอบฟังก์ชัน แต่เมื่อการเรียกใช้ฟังก์ชันเสร็จสมบูรณ์ ค่าเดียวกันนี้จะไม่สะท้อนถึงฟังก์ชันหลักภายนอก
การใช้พอยน์เตอร์เป็นอาร์กิวเมนต์ของฟังก์ชันจะช่วยส่งผ่านที่อยู่จริงของตัวแปรในฟังก์ชัน และการเปลี่ยนแปลงทั้งหมดที่ดำเนินการกับตัวแปรจะสะท้อนให้เห็นในฟังก์ชันภายนอก
ในกรณีข้างต้น ฟังก์ชัน 'test' มีที่อยู่ของตัวแปร 'a' และ 'b' ตัวแปรทั้งสองนี้สามารถเข้าถึงได้โดยตรงจากฟังก์ชัน 'ทดสอบ' และด้วยเหตุนี้การเปลี่ยนแปลงใด ๆ ที่ทำกับตัวแปรเหล่านี้จะสะท้อนให้เห็นในฟังก์ชันผู้เรียก 'main'
ข้อดีของการใช้พอยน์เตอร์
นี่คือข้อดี/ประโยชน์ของการใช้พอยน์เตอร์
- พอยน์เตอร์เป็นตัวแปรที่เก็บที่อยู่ของตัวแปรอื่น ตัวแปรเข้า C++.
- ตัวแปรมากกว่าหนึ่งตัวสามารถแก้ไขและส่งกลับโดยฟังก์ชันโดยใช้พอยน์เตอร์
- หน่วยความจำสามารถจัดสรรและยกเลิกการจัดสรรแบบไดนามิกได้โดยใช้พอยน์เตอร์
- ตัวชี้จะช่วยลดความซับซ้อนของโปรแกรม
- ความเร็วในการดำเนินการของโปรแกรมดีขึ้นโดยใช้พอยน์เตอร์
สรุป
- ตัวชี้หมายถึงที่อยู่การถือครองตัวแปรของตัวแปรอื่น
- พอยน์เตอร์แต่ละตัวมีชนิดข้อมูลที่ถูกต้อง
- ตัวชี้คือการแสดงสัญลักษณ์ของที่อยู่หน่วยความจำ
- พอยน์เตอร์อนุญาตให้โปรแกรมจำลองการโทรโดยการอ้างอิง และสร้างและจัดการโครงสร้างข้อมูลแบบไดนามิก
- อาร์เรย์ และพอยน์เตอร์ใช้แนวคิดที่เกี่ยวข้องกัน
- ชื่ออาร์เรย์หมายถึงฐานของอาร์เรย์
- หากคุณต้องการกำหนดที่อยู่ของอาร์เรย์ให้กับพอยน์เตอร์ อย่าใช้เครื่องหมายแอมเปอร์แซนด์ (&)
- หากไม่มีที่อยู่เฉพาะสำหรับกำหนดตัวแปรพอยน์เตอร์ ให้กำหนดให้เป็น NULL