본문 바로가기

프로그래밍/C언어

[C언어] 포인터(1) - 포인터란 ?

안녕하세요 ! 초보개발자 입니다. 

이 블로그는 개인 공부 정리용 블로그 입니다. 

혹 잘못된 내용이 있다면 지적 부탁드리겠습니다.

그리고 질문주신다면 최대한 아는선에서 답변드리도록 하겠습니다.

그럼 시작하도록 하겠습니다.




1. 포인터


1. 변수와 메모리 주소

 

int i = 1;  이 코드는 int형 타입의 변수 i를 선언하고 1을 저장한 코드입니다. 변수 i는 메모리 어딘가에 저장될 것 입니다.



 위 그림에서 파란색 부분이 i 변수 입니다. 메모리의 주소는 0x100 ~ 0x103 까지 4byte의 공간이 주어졌습니다. 요약하면 다음과 같습니다. 


변수의 이름 : i

변수의 타입 : int

메모리 주소 : 0x100

값 : 0x000000001 


이때까지 변수를 변수의 이름으로만 다루었지만 변수를 주소로 다루는 것도 가능합니다. 메모리의 저장공간은 고유의 주소를 가지고 있기 떄문에 주소만 알면 값을 불러오거나 저장 할 수 있습니다. 이 처럼 메모리의 주소를 다루기 위한 것이 포인터라고 할 수 있습니다.


2. 포인터

포인터는 메모리 주소를 저장하기 위한 변수 입니다. 포인터를 선언하는 방법은 변수를 선언하는 법과 똑같습니다. 단지 포인터는 메모리 주소를 저장하기 위한 것만 다릅니다. 포인터를 선언하는 방법은 다음과 같습니다.


int * ptr ;


ptr은 포인터의 이름을 뜻하고 int * 은 포인터의 타입 int는 포인터가 가리키는 대상의 타입을 뜻합니다.


포인터에 주소를 저장하기 위해서는 먼저 포인터가 가리킬 대상의 주소를 얻어야 합니다. 주소를 얻는 방법은 &연산자를 사용하는 것입니다. &연산자는 scanf함수를 사용할 때 많이 본 것입니다.


int i =1; 

int *ptr = &i;


위의 소스는 변수 i를 선언하고 i의 주소값을 포인터 변수 ptr에 저장한 것입니다. 예제를 통하여 알아 보겠습니다.


1
2
3
4
5
6
7
8
int main(void) {
    int i = 1;
    int *ptr = &i;
 
    printf("i = %d\n", i);
    printf("ptr = %p\n", ptr);
    return 0;
}
cs


위의 소스를 실행하면 i = 1, ptr = 006FFAAB가 나옵니다. ptr 은 변수 i 의 주소 값을 가지고 있습니다. ptr은 실행때 마다 주소 값이 달라지므로 매번 결과가 다릅니다. 메모리 주소를 출력하는 지시자는 %p 입니다.


포인터가 가리키는 대상에 저장된 값을 가지고 올 떄는 *연산자를 사용합니다.


위의 소스에서 printf("*ptr = %d\n",*ptr); 을 추가하면 변수 i 와 같은 저장공간의 값을 가져 오게 됩니다. 


이상으로 오늘의 강의는 마치도록 하겠습니다. 다음시간에는 포인터를 이어서 진행하도록 하겠습니다.