리메이크 중/C,C++ 이론 중심

C(&C++) 이론 19. 이중 포인터

라이피 (Lypi) 2023. 2. 12. 15:03
반응형

 


내용 참고

혼자 연구하는 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 = &pi;
  
  cout << **ppi << endl;
}

■  여기서 주의할 점은 int* pi = &i; 상태에서 int** ppi = &pi;는 가능하지만, 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** 타입이다.

■  이 부분은 참조 호출이 필요한 부분이기 때문에 주소로 주고받아야 하는 것이다.


반응형