Computer >> 컴퓨터 >  >> 프로그램 작성 >> C++

C++의 댕글링, 보이드, 널 및 와일드 포인터

<시간/>

댕글링 포인터

댕글링 포인터는 해제(또는 삭제)된 메모리 위치를 가리키는 포인터입니다. 포인터가 매달린 포인터 역할을 하는 여러 가지 방법이 있습니다.

함수 호출

로컬 변수를 가리키는 포인터는 로컬 변수가 정적이지 않을 때 댕글링됩니다.

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 포인터는 어떤 데이터 유형과도 연결되지 않은 포인터입니다. 저장소의 일부 데이터 위치를 가리키는 것은 변수의 주소를 가리키는 것을 의미합니다. 범용 포인터라고도 합니다.

몇 가지 제한 사항이 있습니다.

  • 포인터 연산은 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이 아닌 경우에만 포인터 변수를 역참조합니다.

예시

#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;
}