Search

포인터

언어
C
태그
포인터

포인터란?

주소를 가리킨다.
변수이기 때문에 포인터 변수라고도 한다.
포인터는 변수의 주소값을 저장한다.

선언

포인터 변수를 선언할 때는 자료형에 * 를 붙여서 선언한다.
만약 int 형 변수의 주소를 담고싶으면 int * 를 사용한다.
자료형에 따른 주소값의 크기 변화는 없으며, 일정하다.
32 bit 시스템이면 4 byte, 64 bit 시스템이면 8 byte 이다.
#include <stdio.h> int main() { int *p = NULL; int num = 15; p = &num; printf("int 변수 num의 주소 : %d \n", &num); printf("포인터 p의 값 : %d \n", p); printf("포인터 p가 가리키는 값 : %d \n", *p); return 0; }
C
복사
포인터 p의 값 : 36421020 포인터 p가 가리키는 값 : 15
Plain Text
복사
*p 를 이용하면 p 에 들어있는 주소로 가서 그 변수의 값을 가져온다.

주의

증감연산자가 참조 연산자보다 우선순위가 높다.
*p++ 의 경우 주소값이 들어있는 변수 p 를 먼저 증감시킨다.
그 후에 주소를 찾아간다.

인자를 전달하는 방식

Call by value

기본적으로 C 언어에서 지원하는 방식이다.
함수에서 값을 복사해서 전달하는 방식으로, 인자로 전달되는 변수를 함수의 매개변수에 복사한다.
인자로 전달한 변수와는 별개의 변수가 되며, 매개 변수를 변경해도 원래의 변수에 영향을 미치지 않는다.
원본 값을 바꿀 필요가 없는 경우 에는 call by value 방식을 이용하면 된다.

Call by reference

포인터를 사용해서 주소값을 넘겨주는 경우를 말한다.
그냥 변수를 넘겨줄 때와는 다르게 원래 변수의 값도 바뀌게 된다.
원칙적으로 C 언어에서 함수 인자 전달은 call by value 이지만 포인터를 사용하여 call by reference 를 구현할 수도 있다.

예제

#include <stdio.h> int swapStudent(int *left, int *right) // 해당 주소의 값을 가리킨다. { int temp; if(*left > *right) { temp = *right; *right = *left; *left = temp; } } int main() { int left; int right; scanf("%d", &left); scanf("%d", &right); swapStudent(&left, &right); // 매개 변수 전달 시 주소값을 건내줘야 한다. printf("왼쪽 : %d, 오른쪽 : %d", left, right); return 0; }
C
복사

포인터의 연산

일반 변수에서 전/후위 연산을 사용하면 1 씩 증가 하거나 감소한다.
포인터 변수에서는 1 씩 증가하는 것이 아니다.
int 형 포인터의 경우 4 씩 증가한다.
double 형 포인터의 경우 8 씩 증가한다.
즉 더하거나 뺄 때 자료형의 크기만큼 증가/감소 한다.
만약 배열처럼 사용하려면 아래와 같이 사용한다.
*(arr + i) == arr[i]
C
복사

상수화

cosnt 를 포인터 앞에 사용하게 되면 변수의 값이 변경되는 것을 막을 수 있다.
만약 자료형 다음에 const 를 사용하게 되면 포인터 변수 자체가 상수화 된다.
즉, 주소값을 변경할 수 없게 된다.
포인터를 통해 값을 변경하는 것도, 다른 변수를 가리키는 것도 불가능하게 하고 싶다면 const 를 두 번 써줄 수 있다.