Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

Dangling, Void, Null และ Wild Pointers ใน C++


ตัวชี้แบบห้อย

ตัวชี้แบบห้อยคือตัวชี้ที่ชี้ไปยังตำแหน่งหน่วยความจำที่ว่าง (หรือถูกลบ) มีหลายวิธีที่ Pointer ทำหน้าที่เป็นตัวชี้แบบห้อย

เรียกฟังก์ชัน

ตัวชี้ที่ชี้ไปที่ตัวแปรในเครื่องจะห้อยต่องแต่งเมื่อตัวแปรในเครื่องไม่คงที่

int *show(void) {
   int n = 76; /* ... */ return &n;
}

ผลลัพธ์

Output of this program will be garbage address.

ยกเลิกการจัดสรรหน่วยความจำ

int main() {
   float *p = (float *)malloc(sizeof(float));
   //dynamic memory allocation.
   free(p);
   //after calling free()
   p becomes a dangling pointer p = NULL;
   //now p no more a dangling pointer.
}

ตัวแปรอยู่นอกขอบเขต

int main() {
   int *p //some code// {
      int c; p=&c;
   }
   //some code//
   //p is dangling pointer here.
}

ตัวชี้เป็นโมฆะ

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

มันมีข้อจำกัดบางอย่าง

  • เลขคณิตของตัวชี้เป็นไปไม่ได้สำหรับตัวชี้ void เนื่องจากมีขนาดที่เป็นรูปธรรม
  • ไม่สามารถใช้เป็นข้อมูลอ้างอิงได้

ตัวอย่าง

#include<stdlib.h>
#include<iostream>
using namespace std;
int main() {
   int a = 7;
   float b = 7.6;
   void *p;
   p = &a;
   cout<<*( (int*) p)<<endl ;
   p = &b;
   cout<< *( (float*) p) ;
   return 0;
}

ผลลัพธ์

7
7.600000

อัลกอริทึม

Begin
   Initialize a variable a with integer value and variable b with float value.
   Declare a void pointer p.
   (int*)p = type casting of void.
   p = &b mean void pointer p is now float.
   (float*)p = type casting of void.
   Print the value.
End.

ตัวชี้ค่า Null

ตัวชี้ค่าว่างเป็นตัวชี้ที่ไม่ชี้อะไร

การใช้ null pointer บางส่วนคือ

  • เพื่อเริ่มต้นตัวแปรพอยน์เตอร์เมื่อตัวแปรพอยน์เตอร์นั้นยังไม่ได้กำหนดแอดเดรสหน่วยความจำที่ถูกต้อง

  • หากต้องการส่งตัวชี้ค่าว่างไปยังอาร์กิวเมนต์ของฟังก์ชัน หากเราไม่ต้องการส่งที่อยู่หน่วยความจำที่ถูกต้อง

  • เพื่อตรวจสอบหาค่า null ก่อนเข้าถึงตัวแปรตัวชี้ใด ๆ เพื่อให้เราสามารถดำเนินการจัดการข้อผิดพลาดในรหัสที่เกี่ยวข้องกับตัวชี้เช่น ตัวแปรตัวชี้ dereference เมื่อไม่ใช่ NULL เท่านั้น

ตัวอย่าง

#include <iostream>
using namespace std;
int main() {
   int *p= NULL; //initialize the pointer as null.
   cout<<"The value of pointer is ";
   cout<<p;
   return 0;
}

ผลลัพธ์

The value of pointer is 0.

ไวลด์พอยน์เตอร์

ไวด์พอยน์เตอร์คือพอยน์เตอร์ที่ชี้ไปยังตำแหน่งหน่วยความจำโดยพลการ (ไม่แม้แต่ NULL)

int main() {
   int *ptr; //wild pointer
   *ptr = 5;
}