포인터란?
포인터란 변수가 저장되어 있는 메모리의 주소를 포인터 라고 합니다. 포인터 변수 라고도 부릅니다.
포인터 사용 방법
포인터의 연산자
포인터는 크게 두 가지의 연산자가 존재합니다.
- & 주소 연산자
변수의 주소를 가져오는 연산자 입니다. - * 참조 연산자
포인터가 가지고 있는 메모리 주소에서 변수 값을 가져오는 연산자 입니다.
포인터 변수 선언
1
2
3
4
5
6
int main() {
int x = 10;
int *y = &x;
printf("x: %d, %p\n", x, y);
return 0;
}
출력:
x: 10, 0x7ffeefbff438
포인터 변수는 변수명 앞에 *을 붙여서 선언합니다. 그리고 변수의 주소는 &로 가져와서 초기화 시켜 줍니다.
역참조 연산자 사용
1
2
3
4
5
6
7
8
int main() {
int x = 10;
int *y = &x;
printf("x: %d, %p\n", x, y);
*y = 324;
printf("x: %d, %p\n", x, y);
return 0;
}
출력:
x: 10, 0x7ffeefbff438
x: 324, 0x7ffeefbff438
1-2에서 설명 했듯이 포인터 변수 앞에 *을 붙이면 주소에 접근하여 값을 참조합니다. 그래서 *포인터 한 뒤에 대입 연산자로 변수를 바꾸는것 역시 가능합니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
void swap(int a, int b);
void swap_deref(int *a, int *b);
int main() {
int a = 200, b = 300;
swap(a, b);
printf("a: %d, b: %d\n", a, b);
swap_deref(&a, &b);
printf("a: %d, b: %d\n", a, b);
return 0;
}
void swap(int a, int b) {
int temp = a;
a = b;
b = temp;
}
void swap_deref(int *a, int *b) {
int temp = *a;
*a = *b;
*b = temp;
}
출력:
a: 200, b: 300
a: 300, b: 200
역참조 연산자는 이런식으로 활용이 가능합니다. swap()함수는 함수 내부에 지역변수를 3개나 생성해서 처리하는 반면, swap_deref()함수는 지역변수를 하나만 만들고 메모리에 직접 접근해서 처리하기 때문에 사용하는 자원의 양과 속도에서 더 좋습니다.