[C언어] 다중포인터 구현해보기
[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에 대해 자세하게 알아보는 시간을 가져볼 것이다.