컴퓨터 구조/C, C++

다중 포인터란

JiHxxn 2024. 8. 16. 12:00

🤔 다중 포인터 사용 이유

다중 포인터(multiple pointers)를 사용하는 이유는 다양한 상황에서 메모리 주소를 효율적으로 관리하고 조작하기 위해서이다. 다중 포인터는 '포인터의 포인터'를 뜻 한다.

↖️ 다중 포인터 사용 예

  • 다른 메모리 영역(함수)에서 동적 메모리로 초기화시켜주고 싶을 때 사용
  • 다차원 배열의 할당된 메모리를 해제(반환) 시켜주고 싶을 때 사용

TMI

  • 배열의 이름을 담을 수 있는 독립적인 메모리가 존재한다.

🍡 간접 참조를 통한 동적 메모리 할당 및 값 수정

void Change_Refrence(int** ppNum);

int main()
{
   int iNum(100);
   int* pNum = &iNum;

   cout << (pNum) << endl;      // pNum의 선언 당시 주소
   cout << (*pNum) << endl;   // pNum의 값

   Change_Refrence(&pNum);      // pNum의 주소를 보냄(2중 포인터 매개 변수로 보내줌)

   cout << (pNum) << endl;      // 함수를 통해 선언 당시 주소가 아닌 Heap에 할당된 주소가 할당되어 있음.
   cout << (*pNum) << endl;   // 바뀐 주소의 값이 들어가 있음.

   return 0;
}

void Change_Refrence(int** ppNum)   // call by value
{
   *ppNum = new int();      // pNum의 주소를 새로 바꿔줌.
   **ppNum = 500;         // pNum의 값을 500으로 할당해줌.
}

🍡 C에서 문자열 배열 처리

char* strings[] = { "Hello", "World" };
char** pStrings = strings;

🍡 구조체나 클래스의 멤버로 사용된 포인터 해제

struct MyStruct {
    int** data;
    int rows, cols;

    MyStruct(int r, int c) : rows(r), cols(c)  // 생성자
    {
        data = new int*[rows];
        for (int i = 0; i < rows; ++i) {
            data[i] = new int[cols];
        }
    }

    ~MyStruct() // 소멸자
    {
        for (int i = 0; i < rows; ++i) {
            delete[] data[i];  // 각 행 메모리 해제
        }
        delete[] data;          // 포인터 배열 해제
    }
};

 

🍎 추가 : 다중 포인터의 위험성 및 주의점

void Change_Refrence(int** ppNum) 
{
    if (*ppNum != nullptr) {
        delete *ppNum;  // 이전에 할당된 메모리가 있으면 해제
    }
    *ppNum = new int();  // 새로운 메모리 할당
    **ppNum = 500;
}
  • 동적 메모리 할당 해주는 함수에서 방어 코드를 사용하여 메모리 누수를 방지해야 한다.

'컴퓨터 구조 > C, C++' 카테고리의 다른 글

C/C++ 동적 할당  (0) 2024.08.18
구조체 크기 계산법 및 최적화  (0) 2024.08.12
const와 포인터  (0) 2024.08.09
[C/C++]포인터 기초  (0) 2024.08.04
[C/C++] 함수란  (0) 2024.07.31