내용 참고
혼자 연구하는 C/C++ (Soen.kr/와우북스)
이중 포인터
■ 이중 포인터란 포인터를 가리키는 포인터라는 의미이다.
■ int** ppi; 라고 쓰면 이중 포인터가 되고, int*** pppi; 라고 쓰면 3중 포인터가 될 것이다.
■ 원한다면 10중 포인터나 그 이상도 만들 수 있지만 3중 포인터 이상은 딱히 의미가 없다.
■ T형 타입에 대한 T형 포인터를 만들 수 있다.
■ T형 포인터는 하나의 타입으로 인정된다.
■ 즉, T형 포인터에 대한 포인터를 만들 수 있다.
■ 이런식으로 사용할 수 있다.
#include <iostream>
using namespace std;
int main()
{
int i = 1234;
int* pi = &i;
int** ppi = π
cout << **ppi << endl;
}
■ 여기서 주의할 점은 int* pi = &i; 상태에서 int** ppi = π는 가능하지만, int** ppi = &&i;는 안된다는 것이다.
■ 포인터 안의 값을 읽어내는 * 연산자는 중복 사용이 가능하지만, 주소값을 저장하는 & 연산자는 중복 사용이 안된다.
■ 왜냐하면 &i 의 리턴값은 아직 메모리에 저장되지 않은 값일 뿐이기 때문이다.
■ 그래서 이 값을 int* pi; 라는 메모리 안에 담고 그 메모리 주소를 저장해야 한다.
■ 대신에 * 연산자는 주소값의 실제 위치에서 값을 뽑아오므로 int* pi; 안에 주소값이 있다면 연속으로 접근이 가능하다.
■ 이중 포인터는 문자열이나 배열처럼 그 자체가 포인터인 값을 이용할 때 유용하다.
#include <iostream>
#include <string.h>
using namespace std;
void InputName(char** pName)
{
*pName= new char;
strcpy(*pName, "Cabin");
}
int main()
{
char* name;
InputName(&name);
cout << name << endl;
delete name;
}
■ void InputName(char** pName) 함수는 문자열인 char* 타입의 주소를 인자로 받는 함수이다.
■ *pName;은 인자로 받은 char* 타입을 의미하며 new로 char형을 동적할당하면 char* 값이 리턴된다.
■ 문자열인 char* 의 주소는 char** 타입이다.
■ 이 부분은 참조 호출이 필요한 부분이기 때문에 주소로 주고받아야 하는 것이다.