C++

c++ 포인터

ITSkeleton 2016. 10. 10. 17:23
728x90
반응형

안녕하세요

ITSkeleton 입니다.


포인터에 대하여 설명을 할건데요.


개념이 어려울 수 있습니다.


포인터란.

배열보다 메모리를 효과적으로 사용하기 위한 것.

입니다.


배열을 사용하면 많은 데이터를 한꺼번에 처리할 수 있지만...

선언 할때 배열의 크기를 정해주어야 합니다.


그렇지 않으면

컴파일 에러를 나타내지요.


방대한 양의 데이터를 처리해야 할때..

배열의 크기또한 방대해 져야합니다.

이때,

메모리를 엄청나게 잡아 먹게 됩니다.


또한,

아무리 크게 잡았다고 하더라도

배열이 모자랄수도 있지요.

그럼 Array 에러가 나오게 되는 것입니다.


이 메모리를 효과적으로 관리할 수 있는 것이

바로 포인트 입니다.



포인터는

데이터가 저장되어있는 위치를 나타내는 메모리 주소를 저장합니다.

해당 메모리 주소를 따라간다면

원하는 값을 찾아 낼수 있지요.


중요한점은!

포인터가 가지고 있는 값은

원하는 값이 아닌 주소 값을 가지고 있는 겁니다!


중요하니 반드시 기억해 주셔야 됩니다.


포인터라는 것을 알려주는 기호는 * 이표시 입니다.

int *exam;


이렇게 적혀있다면 int형인 포인터 exam 입니다.

int 만이 아니라

char,void,bool 다른 형태의 데이터 타입이 될수 있는데.


그 이유는

메모리 주소만 가지고 찾아 갔을 경우

해당 주소에 들어있는 값이 int형인지 char형인지

알수 없기 때문에

포인터 앞에 데이터 타입을 명시해 줌으로 해서

값을 받아 올 수 있도록 하기 위한 것입니다.


설명이 어렵지만

포인터는 배열과 같은 방식으로도 처리가 가능하기 때문에

어렵게 생각하실 필요는 없습니다.


한가지 배열과 다른점은 동적으로 사용하기 때문에

사용을 하고나면 반드시 반납을 해주어야 합니다.

아니면 자신도 모르는 사이에 메모리 공간이 없어져서 프로그램이 갑자기 꺼질수도 있기 때문이지요.



이제, 사용하는 방법에 대하여 알아볼까요?

포인터를 사용할때 편의를 위한 함수들이 존재 합니다.


<malloc.h>

안에 있는 함수 들인데요


malloc, calloc, realloc, free


네가지의 종류를 사용합니다.


먼저


malloc 함수를 사용하는 방법은

int *exam = (int*)malloc(sizeof(int)*10)

exam[0]~ exam[9]

이와 같이 사용을 합니다.


sizeof(int)는 4바이트로 잡습니다.

4*10을 하면 40 바이트가 되는 것이지요


10개의 변수를 저장할 수 있는 40바이트의 공간이 할당 됩니다.


int *exam = (int*)malloc(sizeof(int)*20)

exam[0]~ exam[19]


이렇게 적는다면

20개의 변수를 저장할 수 있는 80바이트의 공간이 할당 되는 겁니다.


이해가 되셧나요?

이해가 되셧을 거라 믿고

계속 얘기를 하겟습니다.


malloc 앞의 (int*)은 

malloc은 메모리 공간만을 할당하기 때문에

void*을 리턴해 줍니다.

그렇지만, (int*)로 캐스트 하게되면

int형 데이터 타입으로 리턴을 받는 것이지요.


자, 다음은

calloc 함수 입니다.


exam = (int *)calloc(10,sizeof(int));


이 calloc 은 데이터의 개수와 크기의 인자값을 받아 옵니다.

이 함수는 malloc으로 메모리 할당을 받은후

메모리가 더 필요할 경우 사용합니다..


calloc(만들어져 있던 메모리공간 크기, 할당을 더 받을 크기)


이렇게 이루어져 있습니다.


이해가 되셧는지요?


다음은 realloc 함수입니다.


exam = (int*) realloc(exam, 20*sizeof(int));


이또한 새로 할당 해줄수 있는 함수인데요

calloc과는 조금 다릅니다.


기존에 할당받아 사용하고 있던 메모리 바로 뒤에 여유 공간이 있을때 그 공간을 사용할 수 있게 해주고

아니면 다른곳에 공간을 할당해 줍니다.


ralloc 을 호출하고 나면 기존의 포인터가 그대로 유지될 수도 있고 포인터의 위치가 변경될 수도 있습니다.

기존의 데이터는 변형 되지 않으니 크게 걱정은 안하셔도 됩니다.


위의 3가지 함수는 메모리를 더이상 할당할 수 없다 라고 판단되면 NULL 값을 리턴해 줍니다.

알아두시면 예외 처리 할때 편하게 사용하실 수 있겟지요?


자 이제 마지막 함수입니다.

free(exam);


이 함수는 반납하는 함수입니다.

할당 받은 공간을 다시 반납함으로 해서 다른 곳에서 할당받아 사용할 수 있도록 만들어 주는 것입니다.


여기까지 포인터와 malloc 함수에 대하여 알아보았습니다~


긴글 따라오시느라 수고하셧습니다.

728x90
반응형