🤔 다중 포인터 사용 이유
다중 포인터(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 |