본문 바로가기
Computer Science

[C언어] 다중포인터 구현해보기

by DuncanKim 2022. 6. 29.
728x90

[C언어] 다중포인터 구현해보기

포인터는 이제 어느 정도 이해를 하고, 어떤 것을 가리키든 그것이 무엇인지 알 수 있다면?

다중포인터를 알아보는 것이 좋겠다.

 

다중 포인터는 다른 것이 없다. 그냥 포인터가 여러 개 겹겹이 쌓인 것이라고 할 수 있다.

 

p  -----> a -----> b -----> 10

이렇게 변수들이 서로를 가리키고 있다고 하자.

 

int b = 10;
int *a = &b;
int *p = &a;

 

이렇게 있다고 볼 수 있다. 하지만 이런 식으로 코드를 작성하면 오류를 경험할 수 있다.

 

int b = 10;
int *a = &b;
int **p = &a; == int *(*p) = &a;

 

이렇게 나타내야 한다. (*p)가 가리키는 곳이 &a이다라고 설정을 해주어야 한다.

그래서 **이 쓰이는 것이고, 이렇게 하면 이중, 삼중, 사중,,, 1023중까지도 가능하다.

그런데 뭐 3중 반복문도 잘 안쓰는데 1023중 포인터는 잘 안쓴다. 이중 포인터만 알면 포인터를 다 이해했다고 보면 될 것이다.

 

아래에서는 이중, 삼중 포인터를 활용한 예시들을 볼 것이다.

 

// 문제 : 원본값을 훼손하는 change 함수를 만들어주세요.(2중포인터)

#include <stdio.h>

void change(int** num) {
  **num = 50;
}

int main(void) {
  int x = 20;
  int* p = &x;

  printf("change 함수 호출하기 전의 x : %d\n", x);

  change(&p);

  printf("change 함수 호출한 후의 x : %d\n", x);
  // 출력 => change 함수 호출한 후의 x : 50

  return 0;
}
/* 결과
change 함수 호출하기 전의 x : 20
change 함수 호출한 후의 x : 50
*/

 

 

// 문제 : 2중 포인터를 사용하는 예제를 만들어주세요.

#include <stdio.h>

int main(void) {
  int a = 20;
  int* p = &a;
  int** pp = &p;
  **pp = 30;
  printf("a : %d", a);
  
  return 0;
}
/* 결과
a : 30
*/

 

 

// 문제 : 원본값을 훼손하는 change 함수를 만들어주세요.(3중포인터)

#include <stdio.h>

void change(int*** num) {
  ***num = 50;
}

int main(void) {
  int x = 20;
  int* p = &x;
  int** k = &p;

  printf("change 함수 호출하기 전의 x : %d\n", x);

  change(&k);

  printf("change 함수 호출한 후의 x : %d\n", x);
  // 출력 => change 함수 호출한 후의 x : 50

  return 0;
}
/* 결과
change 함수 호출하기 전의 x : 20
change 함수 호출한 후의 x : 50
*/

 

위와 같이 이중 포인터를 매개변수로 넣어서 호출하여 사용할 수도 있다.

세 번째 코드의 경우, 왜 &x를 넣어서 쉽게하지 않고, &k를 넣었을까...

change 함수의 매개변수로 &k를 넣어도 함수가 실행이 될 수 있었을까?

 

그것의 정답은 된다이다.

***num을 썼기 때문이다. &k를 매개변수로 불러오면, 3번의 과정을 거쳐서 int x의 값으로 접근할 수 있다.

 

change 함수의 변수 변화

int*** num = k주소값

(1) k의 주소값에서 세 번 연속해서 각각이 가리키는 곳을 향해 찾아들어가라는 명령어로 알아들을 수 있다.
(2) k가 가리키는 곳은 p의 주소값, (3) p의 주소값이 가리키는 곳은 x의 주소값, (4) x의 주소값이 가리키는 것은 정수 10이다.

 

그렇기 때문에, k의 주소값을 매개변수로 해도, 함수에서 값이 바뀌어져 나올 수 있는 것이다.

 

이렇게 다중 포인터에 대해 알아보았다.

참, 알고리즘의 투포인터와 헷갈리면 안 된다. 그곳은 두 개의 포인터를 활용해서 값을 찾는 알고리즘을 '투 포인터'라고 한다.

 

다음에는 call by reference와 call by value에 대해 자세하게 알아보는 시간을 가져볼 것이다.

728x90

댓글