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:

ตัวดำเนินการอ้างอิง (&) และตัวดำเนินการ Deference (*)

มันทำงานอย่างไร:

ตัวดำเนินการอ้างอิง (&) และตัวดำเนินการ Deference (*)

นี่คือภาพหน้าจอของรหัส:

ตัวดำเนินการอ้างอิง (&) และตัวดำเนินการ Deference (*)

คำอธิบายรหัส:

  1. นำเข้าไฟล์ส่วนหัว iostream สิ่งนี้จะช่วยให้เราสามารถใช้ฟังก์ชั่นที่กำหนดไว้ในไฟล์ส่วนหัวโดยไม่ได้รับข้อผิดพลาด
  2. รวมเนมสเปซมาตรฐานเพื่อใช้คลาสโดยไม่ต้องเรียกมัน
  3. เรียกใช้ฟังก์ชัน main() ควรเพิ่มตรรกะของโปรแกรมภายในเนื้อหาของฟังก์ชันนี้ { เป็นเครื่องหมายจุดเริ่มต้นของเนื้อหาของฟังก์ชัน
  4. ประกาศตัวแปรจำนวนเต็ม x และกำหนดค่าเป็น 27
  5. ประกาศตัวแปรพอยน์เตอร์ *ip
  6. เก็บที่อยู่ของตัวแปร x ไว้ในตัวแปรตัวชี้
  7. พิมพ์ข้อความบนคอนโซล
  8. พิมพ์ค่าของตัวแปร x บนหน้าจอ
  9. พิมพ์ข้อความบนคอนโซล
  10. พิมพ์ที่อยู่ของตัวแปร x ค่าของที่อยู่ถูกเก็บไว้ในตัวแปร ip
  11. พิมพ์ข้อความบนคอนโซล
  12. พิมพ์ค่าที่เก็บไว้ตามที่อยู่ของตัวชี้
  13. โปรแกรมควรคืนค่าเมื่อดำเนินการสำเร็จ
  14. ส่วนท้ายของฟังก์ชัน 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:

พอยน์เตอร์และอาร์เรย์

นี่คือภาพหน้าจอของรหัส:

พอยน์เตอร์และอาร์เรย์

คำอธิบายรหัส:

  1. ประกาศตัวแปรตัวชี้จำนวนเต็ม IP
  2. ประกาศอาร์เรย์ชื่อ arr และเก็บจำนวนเต็ม 6 ตัวไว้
  3. กำหนด arr ให้กับ ip ip และ arr จะเท่ากัน
  4. สร้างสำหรับการวนซ้ำ ตัวแปรลูป x ถูกสร้างขึ้นเพื่อวนซ้ำองค์ประกอบอาร์เรย์ตั้งแต่ดัชนี 0 ถึง 5
  5. พิมพ์ค่าที่เก็บไว้ตามที่อยู่ของ IP ของตัวชี้ จะมีการส่งคืนหนึ่งค่าต่อการวนซ้ำ และจะทำซ้ำทั้งหมด 6 ครั้ง จุดสิ้นสุดคือ a C++ คำสำคัญที่หมายถึงบรรทัดสุดท้าย การดำเนินการนี้ช่วยให้คุณสามารถย้ายเคอร์เซอร์ไปยังบรรทัดถัดไปหลังจากพิมพ์แต่ละค่าแล้ว แต่ละค่าจะถูกพิมพ์แยกบรรทัด
  6. เพื่อย้ายตัวชี้ไปยังตำแหน่ง int ถัดไปหลังจากการวนซ้ำทุกครั้ง
  7. สิ้นสุดการวนซ้ำ
  8. โปรแกรมจะต้องส่งคืนบางสิ่งเมื่อดำเนินการสำเร็จ
  9. จุดสิ้นสุดของเนื้อหาฟังก์ชัน main()

ตัวชี้ NULL

หากไม่มีที่อยู่ที่แน่นอนที่จะกำหนด ตัวแปรตัวชี้ก็สามารถกำหนดเป็น NULL ได้ ควรทำในระหว่างการประกาศ ตัวชี้ดังกล่าวเรียกว่าตัวชี้ว่าง ค่าของมันคือศูนย์และถูกกำหนดไว้ในไลบรารีมาตรฐานหลายแห่ง เช่น iostream

3 ตัวอย่าง:

#include <iostream>
using namespace std;
int main() {
	int  *ip = NULL;
	cout << "Value of ip is: " << ip;
	return 0;
}

Output:

ตัวชี้ NULL

นี่คือภาพหน้าจอของรหัส:

ตัวชี้ NULL

คำอธิบายรหัส:

  1. ประกาศตัวแปรตัวชี้ IP และกำหนดค่าเป็น NULL
  2. พิมพ์ค่าของตัวแปรตัวชี้ ip ข้างข้อความบนคอนโซล
  3. โปรแกรมจะต้องคืนค่าเมื่อเสร็จสิ้นสำเร็จ
  4. ส่วนท้ายของฟังก์ชัน 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:

พอยน์เตอร์ของตัวแปร

นี่คือภาพหน้าจอของรหัส:

พอยน์เตอร์ของตัวแปร

คำอธิบายรหัส:

  1. ประกาศตัวแปรพอยน์เตอร์ p และตัวแปร x ที่มีค่า 30
  2. กำหนดที่อยู่ของตัวแปร x ให้กับ p
  3. พิมพ์ค่าของตัวแปรตัวชี้ p ข้างข้อความบนคอนโซล
  4. โปรแกรมจะต้องคืนค่าเมื่อเสร็จสิ้นสำเร็จ
  5. ส่วนท้ายของฟังก์ชัน 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:

การประยุกต์ใช้พอยน์เตอร์

นี่คือภาพหน้าจอของรหัส:

การประยุกต์ใช้พอยน์เตอร์

คำอธิบายรหัส:

  1. สร้างต้นแบบของฟังก์ชันชื่อ test ซึ่งจะใช้พารามิเตอร์จำนวนเต็มสองตัว
  2. เรียกใช้ฟังก์ชัน main() เราจะเพิ่มตรรกะของโปรแกรมเข้าไปในเนื้อความของมัน
  3. ประกาศตัวแปรจำนวนเต็มสองตัว a และ b โดยแต่ละตัวมีค่าเท่ากับ 5
  4. พิมพ์ข้อความบนคอนโซล endl (บรรทัดสิ้นสุด) จะเลื่อนเคอร์เซอร์เพื่อเริ่มพิมพ์ในบรรทัดถัดไป
  5. พิมพ์ค่าของตัวแปร a บนคอนโซลควบคู่ไปกับข้อความอื่น endl (บรรทัดสิ้นสุด) จะเลื่อนเคอร์เซอร์เพื่อเริ่มพิมพ์ในบรรทัดถัดไป
  6. พิมพ์ค่าของตัวแปร b บนคอนโซลควบคู่ไปกับข้อความอื่น endl (บรรทัดสิ้นสุด) จะเลื่อนเคอร์เซอร์เพื่อเริ่มพิมพ์ในบรรทัดถัดไป
  7. สร้างฟังก์ชันชื่อ test() ที่จะรับที่อยู่ของตัวแปร a และ b เป็นพารามิเตอร์
  8. พิมพ์ข้อความบนคอนโซล \n จะสร้างบรรทัดว่างใหม่ก่อนที่จะพิมพ์ข้อความ endl (บรรทัดสิ้นสุด) จะเลื่อนเคอร์เซอร์เพื่อเริ่มพิมพ์ในบรรทัดถัดไปหลังจากพิมพ์ข้อความแล้ว
  9. พิมพ์ค่าของตัวแปร a บนคอนโซลควบคู่ไปกับข้อความอื่น endl (บรรทัดสิ้นสุด) จะเลื่อนเคอร์เซอร์เพื่อเริ่มพิมพ์ในบรรทัดถัดไป
  10. พิมพ์ค่าของตัวแปร b บนคอนโซลควบคู่ไปกับข้อความอื่น endl (บรรทัดสิ้นสุด) จะเลื่อนเคอร์เซอร์เพื่อเริ่มพิมพ์ในบรรทัดถัดไป
  11. โปรแกรมจะต้องคืนค่าเมื่อเสร็จสิ้นสำเร็จ
  12. ส่วนท้ายของฟังก์ชัน main()
  13. การกำหนดฟังก์ชัน test() ฟังก์ชันควรใช้ตัวแปรตัวชี้จำนวนเต็มสองตัว *n1 และ *n2
  14. การกำหนดตัวแปรพอยน์เตอร์ *n1 ให้เป็นค่า 10
  15. การกำหนดตัวแปรพอยน์เตอร์ *n2 ให้เป็นค่า 11
  16. ส่วนท้ายของฟังก์ชัน test()

แม้ว่าค่าใหม่จะถูกกำหนดค่าให้กับตัวแปร a และ b ภายในการทดสอบฟังก์ชัน แต่เมื่อการเรียกใช้ฟังก์ชันเสร็จสมบูรณ์ ค่าเดียวกันนี้จะไม่สะท้อนถึงฟังก์ชันหลักภายนอก

การใช้พอยน์เตอร์เป็นอาร์กิวเมนต์ของฟังก์ชันจะช่วยส่งผ่านที่อยู่จริงของตัวแปรในฟังก์ชัน และการเปลี่ยนแปลงทั้งหมดที่ดำเนินการกับตัวแปรจะสะท้อนให้เห็นในฟังก์ชันภายนอก

ในกรณีข้างต้น ฟังก์ชัน 'test' มีที่อยู่ของตัวแปร 'a' และ 'b' ตัวแปรทั้งสองนี้สามารถเข้าถึงได้โดยตรงจากฟังก์ชัน 'ทดสอบ' และด้วยเหตุนี้การเปลี่ยนแปลงใด ๆ ที่ทำกับตัวแปรเหล่านี้จะสะท้อนให้เห็นในฟังก์ชันผู้เรียก 'main'

ข้อดีของการใช้พอยน์เตอร์

นี่คือข้อดี/ประโยชน์ของการใช้พอยน์เตอร์

  • พอยน์เตอร์เป็นตัวแปรที่เก็บที่อยู่ของตัวแปรอื่น ตัวแปรเข้า C++.
  • ตัวแปรมากกว่าหนึ่งตัวสามารถแก้ไขและส่งกลับโดยฟังก์ชันโดยใช้พอยน์เตอร์
  • หน่วยความจำสามารถจัดสรรและยกเลิกการจัดสรรแบบไดนามิกได้โดยใช้พอยน์เตอร์
  • ตัวชี้จะช่วยลดความซับซ้อนของโปรแกรม
  • ความเร็วในการดำเนินการของโปรแกรมดีขึ้นโดยใช้พอยน์เตอร์

สรุป

  • ตัวชี้หมายถึงที่อยู่การถือครองตัวแปรของตัวแปรอื่น
  • พอยน์เตอร์แต่ละตัวมีชนิดข้อมูลที่ถูกต้อง
  • ตัวชี้คือการแสดงสัญลักษณ์ของที่อยู่หน่วยความจำ
  • พอยน์เตอร์อนุญาตให้โปรแกรมจำลองการโทรโดยการอ้างอิง และสร้างและจัดการโครงสร้างข้อมูลแบบไดนามิก
  • อาร์เรย์ และพอยน์เตอร์ใช้แนวคิดที่เกี่ยวข้องกัน
  • ชื่ออาร์เรย์หมายถึงฐานของอาร์เรย์
  • หากคุณต้องการกำหนดที่อยู่ของอาร์เรย์ให้กับพอยน์เตอร์ อย่าใช้เครื่องหมายแอมเปอร์แซนด์ (&)
  • หากไม่มีที่อยู่เฉพาะสำหรับกำหนดตัวแปรพอยน์เตอร์ ให้กำหนดให้เป็น NULL