Prosto

포인터 (Pointer) - 기초 본문

Programing/C Programing

포인터 (Pointer) - 기초

Prosto 2011. 5. 13. 09:29

포인터란?
포인터는 주소 값을 담고 있는 변수 또는 상수 입니다.
*포인터에는 포인터가 가리키는 메모리에 대한 정보가 포함되어 있습니다.
(주소 값을 지니며, 참조하는 대상의 자료형 정보도 지니는 상수 또는 변수)

포인터는 같은 TYPE형 변수로 지정해야 합니다.
int형 변수는 int형 포인터로.
char형 변수는 char형 포인터로.
double형 변수는 double형 포인터로...
(예)
int num=3;
int * ptr = #
(선언과 동시에 초기화 가능.)
이러한 식으로 이용 가능합니다.

포인터 선언시 *의 앞 뒤 공백은 어떻게 하든 똑같습니다.
int * ptr;
int* ptr;
int *ptr;
모두 같은 의미.

포인터는 4byte 입니다!
변수를 선언 할 때에 int형, char형, double형은 각 각 4byte, 1byte, 8byte지만
int형 포인터, char형 포인터, double형 포인터는 모두 4byte 입니다!

포인터에 사용되는 *과 &
포인터에 사용되는 *연산자 &연산자는 각각 어떤 의미 일까요?
쉽게 말하면 *은 가리키는 연산자
&는 주소를 알려주는 연산자 입니다.
예를 들어,
#include<stdio.h>

int main(void)
{

int num=5;
int * a = &num;
printf("%d, %d \n", num, *a);
return 0;

}

위에서
*a는 &num을 가리키고 있죠?
더 쉽게 말하면 a는 가리키고 있습니다. num의 주소를. ( a는 num의 주소를 가리키고 있습니다.)
(* -> 가리키고 있습니다. // & -> 주소를 알려줍니다.)
이렇게 되면
printf("%d, %d", num, *a);
문장에 있는 num과 *a는 같은 값을 출력하게 됩니다.
*a가 지금 가리키고 있는것이 num이기 때문이죠.

그러면
#include<stdio.h>

int main(void)
{
 

int num=5;
int * a = &num;
*a += 3;
printf("%d \n", num);
return 0;

}

이 결과는 어떨까요?
*a += 3; 를 보면 a가 가리키는 주소에 +3을 하였습니다.
a가 가리키는 주소 num의 주소. 그 변수에 +3을 하니 num=8이 되겠죠?
이렇게 하고 num을 출력시켜보면 8이 나오는 것을 확인 할 수 있습니다.
포인터를 사용하여 가리키는 대상을 바꾸고, 사용할 수 있습니다.

포인터 선언 시 널(NULL)포인터를 선언하면 안전 합니다.
포인터를 선언하고 초기화를 시켜주지 않으면 변수와 마찬가지로
쓰레기 값이 들어 있습니다. 하지만
int * ptr = 0; 와 같이 선언 해주면
널 포인터가 됩니다. 널 포인터를 그냥 그대로 참조하면 에러메시지가 뜨기 때문에 보다 안전합니다.
널(NULL) 포인터라는 것은
'아무 곳에 대한 주소 값도 지니고 있지 않습니다.'
'아무 곳도 가리키고 있지 않습니다.'라는 의미로 이해하면 됩니다.



* 연산자의 정확한 명칭
 : 'Dereferencing operator' 간접 참조 연산자
  (변수의 이름을 이용해서 직접 접근하는 것이 아니고,
   포인터 변수를 이용해서 간접적으로 접근할 때 사용되는 연산자이기 때문에 '간접'이라는 단어가 사용되었다.)




+ 포인트 개념 이해를 돕는 재밌는 문제

int main(void)
{
int num=5;
int * ptr1 = &num;
int * ptr2 = &num;

*ptr1 = *ptr1 + *ptr2;
printf("%d %d %d", num, *ptr1, *ptr2);

return 0;
}
////////////////////////////////////////////////////////////
int main(void)
{
int num=5;
int * ptr1 = &num;
int * ptr2 = ptr1;
(*ptr1)++;
(*ptr2)--;
printf("%d", num);

return 0;
}

어떠한 결과가 나올지 예측해보길 바랍니다~


궁금한 점 있으시거나, 추가 도움말 주실 분은 댓글 달아주세요 ^^

'Programing > C Programing' 카테고리의 다른 글

난수 발생 시키기.  (0) 2011.09.25
포인터 (Pointer) - 기초2  (2) 2011.05.17
1년 달력 계산 (윤년)  (5) 2011.05.15
프로그래밍 시 유의사항 (팁)  (2) 2011.05.13
윤년 계산과 응용.  (3) 2011.05.12
Comments