본문 바로가기

Programming/C Language

포인터 정리

이번에는 C언어에서 매우 중요한 위치를 가지고있는 포인터 개념에 대해 공부해보자!


정리를 시작하기에 앞서 , 포인터는 여러모로 정말 중요한 개념이니 꼭 꼭 꼭 꼭 확실히 잡자!

포인터는 C언어가 Low Level의 특성을 지니는 가장큰 이유다. 

왜냐하면 포인터를 이용하면 메모리의 주소값을 통해 메모리에 직접 접근이 가능하기 때문이다.




 0x0001

0x0002 

0x0003 

0x0004 

0x0005 

0x0006 

A             B               C



위 블록에 칸마다 적어놓은것은 메모리의 주소값이다.
그림에서 보는것과 같이 , 메모리 공간은 1바이트를 단위로 하나의 주소값이 할당되며 , 주소 값도 1씩 증가한다.





char형 변수 A , B와 int형 변수 C를 선언했다고 가정해보자.

char형 변수 A는 0x0001번지에 할당이 되어있고 , char형 변수 B는 0x0002번지에 할당이 되어있고
int형 변수 C는 0x0003 ~ 0x0006에 걸쳐 할당이 되어있다. ( char는 1byte , int는 4byte 임을 참고하자)

하지만 C언어에서는 시작번지만을 가지고 위치를 표현한다.
따라서 int형 변수 num은 0x0003에 할당되어 있다고 표현하는것이 맞다.

이러한 주소값을 저장하기 위해 마련된 변수가 '포인터 변수' 이다.


이번엔 간단한 예시를 통하여 포인터에 대해 이해해보자.

"정수 3이 저장된 int형 변수 num을 선언하고 이 변수의 주소값 저장을 위한 포인터 변수 pnum을 선언하자 , 그리고 pnum에 변수 num의 주소값을 저장하자!"


위의 문장 그대로 코드를 작성해보겠다.
int main(void)

{

int num=3;                            //정수 3이 저장된 int형 변수 num을 선언
int * pnum;                            //num의 주소값 저장을 위한 포인터 변수 pnum 선언

pnum = & num;                     // num의 주소값을 pnum에 저장

}


다음 코드와 같이 포인터변수 선언은 ' * ' 연산자를 이용하고 , 포인터 변수에 주소값을 저장시킬때는 ' & '연산자를 이용한다!

위 문장에서 & 연산자는 피연산자의 주소값을 반환하는 연산자 이다. ( 중요!)

또한 , 변수의 자료형과 포인터 변수의 자료형은 일치해야한다!



예제를 통해 포인터를 이해해보자!




이해를 돕기위하여 매 행에 주석을 달았다.
이를 통해 * 연산자와 & 연산자의 기능을 확실히 이해하자!


결과값을 살펴보자


우리는 num1과 num2에 직접 연산을 하지 않았는데도 불구하고 num1과 num2의 값이 변했다.
이것이 포인터다 , 포인터를 통해 변수의 주소값으로 변수에 접근을하고
접근을 통해 변수의 값을 참조 및 변경 할수있다!

이것이 포인터의 핵심이다!


이해가 안된다면 코드를 분석하며 프로그램의 흐름에 따른 변수값의 변화를 그림으로 그려보자!

그럼 한결 이해가 쉬울 것이다.



'Programming > C Language' 카테고리의 다른 글

포인터 연산  (0) 2017.10.31
포인터와 배열의 관계  (0) 2017.10.31
char형 배열 , 문자열  (0) 2017.10.31
1차원 배열  (0) 2017.10.31
static 변수 (static variable)  (0) 2017.10.31