[C++] 다중 포인터 (이중 포인터)
다중 포인터
인프런 Rookiss님의 'Part1: C++ 프로그래밍 입문' 강의를 기반으로 정리한 필기입니다.
😎[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문 강의 들으러 가기!
포인터를 사용 - 원본 데이터 접근 후 수정
void SetNumber(int* a) { *a = 1; }
int main() { int a = 0; SetNumber(&a);//주소값을 넘긴다. cout << a << endl; }
위의 코드를 실행하면
1
이 출력된다.
원본 데이터가 수정이 되지 않는 경우
void SetMessage(const char* b) { b = "Bye"; }
int main() { // .rdata Hello주소 [H][e][l][l][o][\0] // .rdata Bye주소 [B][y][e][\0] // msg[ Hello 주소 ] << 8바이트(64비트 프로그램 기준) const char* msg = "Hello" // [매개변수][RET][지역변수(msg(Hello주소))] [매개변수(a(Hello주소))][RET][지역변수] SetMessage(msg); cout << msg << endl; // Hello? Bye? }
위의 코드를 실행하면
Hello
가 출력된다.
SetMessage(msg)를 실행하면 아래와 같다.
[매개변수][RET][지역변수(msg(Hello주소))] [매개변수(a(Hello주소))][RET][지역변수]
[매개변수(b(Bye주소))][RET][지역변수]
종료
void SetMessage(const char* b) 내에서 매개변수 주소만 바뀔 뿐 원본에 영향을 주지 않는다.
이중 포인터
void SetMessage(const char** b) { *b = "Bye"; }
int main() { const char* msg = "Hello"; // 주소2 [ ] << 1바이트 // .rdata Hello주소 [H][e][l][l][o][\0] // 주소1[ 주소2 ] << 8바이트 // msg[ Hello주소 ] << 8바이트 // pp[ 주소1] << 8바이트 // pp[ &msg ] << 8바이트 const char** pp = &msg; // [매개변수][RET][지역변수(msg(Hello주소))][매개변수(b(&msg 즉 msg의 주소)][RET][지역변수)] SetMessage(&msg); cout << msg << endl; }
위의 코드를 실행하면
Bye
가 출력된다.
주소2 [ ] << 1바이트 ( .rdata Hello주소 [H][e][l][l][o][\0] )
주소1[ 주소2 ] << 8바이트 ( msg[ Hello주소 ] << 8바이트 )
pp[ 주소1] << 8바이트 ( pp[ &msg ] << 8바이트 )
const char** pp = &msg;
다중 포인터 사용 Tip
다중 포인터
- 그냥 양파까기라고 생각하면 된다
- const char** pp2; 오른쪽부터 왼쪽 순서로 분석하자
- * 을 하나씩 까면서 타고 간다고 생각하자
포인터 + 참조 사용
void SetMessage2(const char*& b) { b = "Wow"; }
int main() { const char* msg = "Hello"; // [매개변수][RET][지역변수(msg(Hello주소))][매개변수(b(&msg 즉 msg의 주소)][RET][지역변수)] SetMessage2(msg); cout << msg << endl; }
위의 코드를 실행하면
Wow
가 출력된다.
[매개변수][RET][지역변수(msg(Hello주소))] [매개변수(b(&msg 즉 msg의 주소)][RET][지역변수)]
SetMessage2(msg);
※ 참조와 포인터는 내부적으로는(=어셈블리 코드 관점에서는) 똑같다.
전체 코드
#include <iostream> using namespace std; void SetNumber(int* a) { *a = 1; } void SetMessage(const char* b) { b = "Bye"; } void SetMessage(const char** b) { *b = "Bye"; } void SetMessage2(const char*& b) { b = "Wow"; } int main() { int a = 0; SetNumber(&a); cout << a << endl; // .rdata Hello주소 [H][e][l][l][o][\0] // .rdata Bye주소 [B][y][e][\0] // msg[ Hello 주소 ] << 8바이트 const char* msg = "Hello"; // [매개변수][RET][지역변수(msg(Hello주소))][매개변수(a(Hello주소))][RET][지역변수] SetMessage(msg); cout << msg << endl; // Hello? Bye? // 주소2 [ ] << 1바이트 // 주소1[ 주소2 ] << 8바이트 // pp[ 주소1] << 8바이트 const char** pp = &msg; // [매개변수][RET][지역변수(msg(Hello주소))][매개변수(b(&msg 즉 msg의 주소)][RET][지역변수)] SetMessage(&msg); cout << msg << endl; // 다중 포인터 // 그냥 양파까기라고 생각하면 된다 // const char** pp2; 오른쪽부터 왼쪽 순서로 분석하자 // * 을 하나씩 까면서 타고 간다고 생각하자 // // [매개변수][RET][지역변수(msg(Hello주소))][매개변수(b(&msg 즉 msg의 주소)][RET][지역변수)] SetMessage2(msg); cout << msg << endl; return 0; }
실행화면

'⭐ Programming > C++' 카테고리의 다른 글
[C++] 포인터와 배열, 메모리 오염 (0) | 2022.03.28 |
---|---|
[C++] 다차원 배열, 2차원 배열 (0) | 2022.03.27 |
[C++] 배열과 Swap함수를 활용한 연습: 로또 번호 생성기 (0) | 2022.03.27 |
[C++] 포인터 vs 배열 (0) | 2022.03.26 |
[C++] 배열 기초 (0) | 2022.03.26 |
댓글
이 글 공유하기
다른 글
-
[C++] 포인터와 배열, 메모리 오염
[C++] 포인터와 배열, 메모리 오염
2022.03.28포인터 마무리, 메모리 오염 인프런 Rookiss님의 'Part1: C++ 프로그래밍 입문' 강의를 기반으로 정리한 필기입니다. 😎[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문 강의 들으러 가기! 포인터 vs 배열 포인터 - 주소를 담는 바구니 - 원본은 저~ 멀리 어딘가에 있음 - p는 단지 그 곳으로 워프하는 포탈 int* p; 배열 - 진짜배기! 원조 데이터 - 닭장처럼 데이터의 묶음 (엄청 많고 거대함) int arr[10] = { 1, 2, 3, 4, 5, 6, 7, 8 }; 포인터 vs 배열 - 그런데 상당히 많은 사람들이 [배열 = 포인터]라 착각하는 경향이 있음. - [배열의 이름]은 배열의 시작 주소값을 가리키는 TYPE* 포인터로 변환 가… -
[C++] 다차원 배열, 2차원 배열
[C++] 다차원 배열, 2차원 배열
2022.03.27다차원 배열 인프런 Rookiss님의 'Part1: C++ 프로그래밍 입문' 강의를 기반으로 정리한 필기입니다. 😎[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문 강의 들으러 가기! 2차원 배열 int main() { int a[10] = { 1, 2, 3 }; int first[5] = { 4, 2, 3, 4, 1 }; int second[5] = { 1, 1, 5, 2, 2 }; int apartment2D[2][5] = { { 4, 2, 3, 4, 1 }, { 1, 1, 5, 2, 2 } }; } 4 2 3 4 1 1 1 5 2 2 순서로 저장된다. 배열 int apartment2D[2][5] = { { 4, 2, 3, 4, 1 }, { 1, 1, 5,… -
[C++] 배열과 Swap함수를 활용한 연습: 로또 번호 생성기
[C++] 배열과 Swap함수를 활용한 연습: 로또 번호 생성기
2022.03.27로또 번호 생성기 인프런 Rookiss님의 'Part1: C++ 프로그래밍 입문' 강의를 기반으로 정리한 필기입니다. 😎[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문 강의 들으러 가기! 1. Swap 함수 만들기 void Swap(int& a, int& b) { int temp = a; a = b; b = temp; } 원본 데이터를 수정하기 위해 & 참조 타입으로 매개변수를 받는다. 2. 정렬 함수 만들기 정렬 함수 만들기 (작은 숫자가 먼저 오도록 정렬) { 1 ,3, 5, 6, 15, 42 } => { 1, 3, 5, 6, 15, 42 } void Sort(int numbers[], int count) { for (int i = 0; i < count… -
[C++] 포인터 vs 배열
[C++] 포인터 vs 배열
2022.03.26포인터 vs 배열 인프런 Rookiss님의 'Part1: C++ 프로그래밍 입문' 강의를 기반으로 정리한 필기입니다. 😎[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문 강의 들으러 가기! 포인터 vs 배열 문자열 = 문자 배열 const char msg1[] = { 'H','e', 'l', 'l', 'o', '\0' }; // 끝났다는 의미로 아스키코드 null인 '\0' 입력 cout char*) // 즉 배열의 내용 전체를 넘긴게 아니라, 시작 주소(포인터)만 넘긴 것 void Test(char a[]) { a[0] = 'x'; } int a = 0; // [매개변수][RET][지역변수(a=0)] Test(a); cout
댓글을 사용할 수 없습니다.