포인터란?
•
주소를 가리킨다.
•
변수이기 때문에 포인터 변수라고도 한다.
•
포인터는 변수의 주소값을 저장한다.
선언
•
포인터 변수를 선언할 때는 자료형에 * 를 붙여서 선언한다.
◦
만약 int 형 변수의 주소를 담고싶으면 int * 를 사용한다.
•
자료형에 따른 주소값의 크기 변화는 없으며, 일정하다.
◦
32 bit 시스템이면 4 byte, 64 bit 시스템이면 8 byte 이다.
#include <stdio.h>
int main()
{
int *p = NULL;
int num = 15;
p = #
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 를 두 번 써줄 수 있다.