포인터(Pointer)는 주소값을 저장하는 변수이다.
char var = 'A';
만약 var이라는 변수에 'A'가 저장되어 있다면 var이라는 변수명을 통해 데이터에 접근할 수 있다. 하지만 var 대신 다른 변수에 주소값을 저장하고 사용할 수도 있다.
만약 var이 메모리 100번째에 저장되어 있다면 포인터는 100이라는 주소값을 가지고 있는 것이다. 그리고 이러한 포인터의 주소값을 활용해 해당 변수에 접근할 수 있다.
포인터 선언
// 데이터_자료형* 변수명;
char* pointer;
char *pointer;
char *p1, *p2;
포인터를 선언하기 위해서는 포인터가 가르킬 값의 자료형을 선언해 주어야 한다. 그리고 *을 붙이면 포인터를 선언할 수 있게 된다. *의 위치는 자료형 뒤에 붙이거나 변수명의 앞에 붙여 사용할 수 있다.
// &변수명 -> 변수의 주소값
char* pointer = &var;
&는 변수의 주소값을 뜻한다.
#include <stdio.h>
int main(void)
{
char var = 'A';
char* pointer = &var;
printf("*pointer: %c\n", *pointer); // *pointer : A
return 0;
}
만약 pointer 변수 앞에 *를 붙이면 포인터에 지정된 값(주소값)에 위치한 메모리에 접근한다.
정리:
#include <stdio.h>
int main(void)
{
char var = 'A';
char* pointer = &var;
printf("var: %c\n", var);
// var: A
printf("pointer: %#x\n", pointer);
// pointer: 0x60ffc74
printf("*pointer: %c\n", *pointer);
// *pointer : A
return 0;
}
함수 활용
포인터를 활용하면 함수에서 여러 값을 반환하는 효과를 낼 수 있다.
#include <stdio.h>
void AddTen(int*, int*);
int main(void)
{
int a = 3;
int b = 6;
AddTen(&a, &b);
printf("a: %d, b: %d", a, b);
// a: 13, b: 16
return 0;
}
void AddTen(int* num1, int* num2)
{
*num1 += 10;
*num2 += 10;
}
함수에 변수들의 값을 복사해 주는 것이 아니라 변수에 접근할 수 있는 주소 정보를 전달하는 것이다.
기존에 매개변수에 직접 데이터를 넘겨주던 방식과는 다르게 함수에서 직접 데이터에 접근해 작업을 수행한다.
위 코드의 초기 상태를 도식화하면 위 이미지와 같다.
만약 AddTen 함수를 실행하면 아래와 같이 변하게 되는 것이다.