🖐️ [C언어] 포인터(Pointer)
변수가 값을 저장한다면, 포인터 변수는 다른 변수들의 주소 값을 저장하는 변수다. 포인터를 이해하기 위해서 왜 포인터를 사용하는지 알게된다면 포인터를 보다 쉽게 이해할 수 있다.
☑️ 왜 포인터를 사용하나?
C언어에서 변수를 Swap하는 함수를 다음과 같이 작성했다.
void swap(int a, int b) {
int temp = a;
a = b;
b = temp;
}
int main() {
int x = 5, y = 10;
printf("Before swap: x = %d, y = %d\n", x, y);
swap(x, y);
printf("After swap: x = %d, y = %d\n", x, y);
return 0;
}
위 코드를 통해서 변수 x와 y의 값이 서로 변경될 것을 기대하지만, 생각한 대로 작동하지 않는다. 변수 x와 변수 y를 전달하는 것이 아니라, 변수 x와 변수 y의 값을 복사해서 전달했기 때문이다.
포인터를 사용해서 변수 x와 변수 y에 직접 접근할 수 있도록 해보자.
void swap(int *a, int *b) {
int temp = *a;
*a = *b;
*b = temp;
}
int main() {
int x = 5, y = 10;
printf("Before swap: x = %d, y = %d\n", x, y);
swap(&x, &y);
printf("After swap: x = %d, y = %d\n", x, y);
return 0;
}
위 코드는 Swap 함수에서 매개 변수를 Pointer 타입으로 지정하여 변수의 주소를 받을 수 있게 되었다. 이야기를 정리하면, 변수의 값을 복사하여 받는 것이 아니라 변수 자체에 접근해야 할 때 포인터를 사용한다.
☑️ 포인터 연산자의 기호들
포인터 연산에서 2개의 연산자 기호가 사용된다. 주소 연산자(&)와 역참조 연산자(*)다. 각자 역할을 살펴보자.
🟧 주소 연산자(& 연산자)
int x = 10 // 변수 x는 메모리 주소 0x10에 위치해있다.
int *ptr = &x // 포인터 변수 ptr은 x의 주소 0x10을 가진다.
변수 앞에 붙여서 사용할 수 있으며, 해당 변수가 위치한 메모리의 주소를 반환한다. 포인터 변수에 특정 변수의 주소를 할당할 때, 사용된다.
🟧 역참조 연산자(* 연산자)
int x = 10;
int &ptr = &x;
printf("%d", *ptr); // x의 값인 10을 출력한다.
*ptr = 20; // x의 값을 10 -> 20으로 변경한다.
포인터 변수 앞에서 붙여서 사용하며, 메모리 주소에 저장된 값에 접근한다. 포인터를 통해서 값을 읽고 수정할 때 사용된다. 이때의 주의할 점은 변수 선언에서 사용되는 * 연산자의 의미와 변수 사용할 때 사용되는 * 연산자의 의미는 서로 다르다.
예제는 다음과 같다.
int* ptr; // 해당 변수가 Pointer임을 나타내기 위해서 사용된다.
*ptr = 10 // 포인터 변수 ptr이 가리키는 메모리 주소의 값을 나타내기 위해 사용된다.
☑️ 이중 포인터(Double Pointer)
포인터는 사용 목적에 따라서 이중, 삼중까지 사용될 수 있다. 여기에서 이중 포인터는 포인터 변수의 주소를 저장하는 포인터 변수다. 그러면 삼중 포인터는 포인터 변수의 주소를 저장하는 포인터 변수의 주소를 저장하는 포인터 변수가 된다. 삼중 포인터부터는 머리가 아파지니까 이중 포인터를 이해하고 삼중 포인터를 생각하자. 이중 포인터는 주로 포인터 변수를 관리할 때 사용된다.
'언어 > C' 카테고리의 다른 글
[C언어] 동적 할당(malloc, calloc, realloc) (0) | 2024.10.08 |
---|