Technology/C & C++

[C/C++]포인터 매개변수로 메모리 제어

문베디드 2022. 4. 23. 22:08

포인터란?

C/C++에서 사용하는 메모리 접근 방식으로, 선언한 변수의 메모리 주소 직접 접근하는 방법

보통 직접 선언한 함수에서 파라미터로 받아온 변수를 제어하기 위해 사용한다.

포인터변수 개념

 

예제1. 일반변수를 인자로 사용한 경우

목적: 변수 num1과 num2에 있는 값을 서로 바꾸기

1
2
3
4
5
6
7
8
9
10
11
12
void swap(int* a, int* b) {
    int tmp = *a;
    *= *b;
    *= tmp;
}
int main()
{
    int num1 = 1, num2 = 2;
    printf("%d %d\n", num1, num2);
    swap(&num1, &num2);
    printf("%d %d\n", num1, num2);
}
cs

 

실행결과

성공적으로 num1과 num2가 바뀌었다.

 

 

예제2. 포인터를 인자로 사용한 경우 1

목적: 포인터 p1과 p2 가 가리키는 주소 바꾸기

1
2
3
4
5
6
7
8
9
10
11
12
void swapPointer(int* a, int* b) {
    int *tmp = a;
    a = b;
    b = tmp;
    printf("%d %d\n"*a, *b);
}
int main(){
    int num1 = 1, num2 = 2* p1 = &num1, * p2 = &num2;
    printf("%d %d\n"*p1, *p2);
    swapPointer(p1, p2);
    printf("%d %d\n"*p1, *p2);
}
cs

 

실행결과

바뀌어야 할 포인터가 바뀌지 않았다. swapPointer 내부에서는 바뀐듯 출력되지만 실제로 함수를 벗어나서 인자로 들어갔던 p1, p2의 값을 출력하니 바뀌지 않았다.

 

예제3. 포인터를 인자로 사용한 경우 2

목적: 포인터 p1과 p2 가 가리키는 주소 바꾸기

1
2
3
4
5
6
7
8
9
10
11
12
13
void swapPointer(int** a, int** b) {
    int *tmp = *a;
    *= *b;
    *= tmp;
    printf("%d %d\n"**a, **b);
}
int main(){
    int num1 = 1, num2 = 2* p1 = &num1, * p2 = &num2;
    printf("%d %d\n"*p1, *p2);
    swapPointer(&p1, &p2);
    printf("%d %d\n"*p1, *p2);
}
 
cs

 

실행결과

성공!!

 

그럼 이유는 무엇일까? 우리가 배운 포인터연산은 특정 변수 주소값을 통해 함수에서 변수가 가진 어떤 값을 변경할수 있는 것이다. 그럼 포인터변수가 가진 어떤 값(다른변수 주소값)을 바꾸려면 어떻게 해야할까? 포인터변수를 가르키는 포인터 변수를 사용한다.

포인터변수 일반변수라고 생각하지말고 포인터변수도 하나의 변수로 생각을 해보면 간단하다. 변수에 내용을 바꾸기 위해서 포인터를 사용한다. 포인터변수의 포인터는 이중 포인터다. 그럼 삼중 사중도 될까? 된다.. 근데 쓰지마 ㅠㅠ

 

결론: 포인터가 가리키는 값을 함수내에서 바꾸귀 위해서는 파라미터로 "이중 포인터"를 사용해야한다.

 

 

참조

이중포인터를 쓰는 주된 이유는 메모리 할당이라고 생각한다. 더 심화내용을 이해하고 싶다면 아래 링크를 참고하자.

https://dojang.io/mod/page/view.php?id=553 

 

C 언어 코딩 도장: 63.3 이중 포인터 매개변수 사용하기

지금까지 함수에서 포인터 매개변수를 이용해서 정수, 실수 등의 값을 가져왔습니다. 그러면 일반적인 값 대신 포인터(메모리 주소)를 얻어오려면 어떻게 해야 할까요? 먼저 함수에 포인터를 넘

dojang.io