※읽다보면 헷갈리는 부분이 있을 수 있습니다. 그럴 때 거기에 막혀서 검색해보기 전에, 일단 모두 읽어보시길 추천합니다!
서술된 내용 뒤에 보충 설명을 달아놓은 경우가 많습니다^^

 

 

 

 

포인터란?


 


C에서 포인터 변수는

자료형* 변수명;                 <- 이렇게 선언되고는 합니다.

 

※포인터 변수 선언 방식

1. 자료형* 변수명;

2. 자료형 * 변수명;

3. 자료형 *변수명;

모두 가능합니다.

그러나 저는 1번 방식을 추천드립니다

 

 


저는 포인터=주소명, *포인터=주소에 도착한 포인터 라고 이해했습니다.



다음의 간단한 예제를 보며 이해를 해보겠습니다.(이해에 앞서, *연산자는 주소에 접근, &연산자는 주소를 반환합니다.)

int main(void) {

    int num = 5;
    int* ptr; //int형 포인터 변수 ptr 선언

    ptr = &num; //포인터 변수 ptr에 num의 주소를 저장(&num은 num의 주소를 반환합니다)



    printf("주소명(포인터) = 0x%x \n", ptr); //주소명 표시
    printf("주소에 도착한 포인터(*포인터) = %d \n", *ptr); //주소에 도착한 포인터 변수 ptr이 마치 num인듯이 행동

    return 0;
}


실행결과



주소를 16진수로 표현하는 컴퓨터 업계에서 주로 컴퓨터의 언어인 2진수로 쉽게 표현할 수 있고, 2진수를 줄여서 쓸 수 있기 때문이라 합니다. 




좀 더 자세히 설명하자면(사실상 저는 위의 예제 하나면 포인터의 개념을 모두 설명했다 생각합니다.)


포인터 변수란 메모리의 주소 값을 저장하기 위한 변수입니다.

&연산자를 통해 num의 주소 값을 반환하여,

int형 포인터 변수 ptr에는 변수 num의 '시작번지 주소'가 저장됩니다.

그리고 *연산자를 이용해 포인터가 가르키는 메모리 공간에 접근합니다.(*ptr을 통해 num이 가르키는 메모리에 접근하여 num처럼 행동하였습니다)


이러면 포인터 개념 설명 끝!


+추가)


포인터 변수에도 다양한 타입이 존재합니다. int, double, char, unsigned int 등등..

포인터 변수에 이러한 타입이 왜 존재하느냐!하면 다음 코드를 보고 생각해봅시다.


double num = 3.14;
int* pnum=&num;


double형의 크기는 8byte, int형의 크기는 4byte입니다.

포인터 변수 pnum는 int형이고 크기는4byte인데 여기에는 double형 num의 주소가 담겨있습니다. 이는

 "num의 시작 주소부터 4byte를 읽겠다"를 의미합니다.

허나 num의 크기는 8byte이므로 포인터 변수 pnum은 *pnum으로 num에 접근하였을 때 읽다말아서(8byte 중에서 4byte만 읽어서) 원하는 값을 표시하지 않습니다.


따 라 서~~ 포인터 변수의 타입의 존재 이유는 * 연산자로 메모리를 올바르게 읽기 위해서라 할 수 있을것 같습니다.


++추추가)


잘못된 포인터의 사용과 널 포인터


다음의 포인터 선언의 잘못된 예를 보시고 무엇이 잘못되었는지 맞춰보시기 바랍니다.


int* ptr;
*ptr = 0;




C언어에서 변수를 초기화하지 않고 선언 시, 쓰레기값이 저장됩니다.

int *ptr; 을 실행하였을 때, 포인터 변수 ptr에는 임의의 주소값(쓰레기 값)이 저장될 것 입니다.

*ptr = 0;을 실행한다면? 그 임의의 주소값에 0을 저장하겠죠.


근데 만약 *ptr이 가르키는 곳이 메모리상의 중요한 부분이였다면 어떻게 될까요?? 컴퓨터를 다신 사용할 수 없을지도 모릅니다..

다행히 요즘 운영체제는 이런 사고를 방지시켜준다 하네요.

그렇다면 올바르게 사용하려면 어떻게 해야할까요??



int* ptr = &num; //<- 처럼 선언과 동시에 초기화 시켜주던가,

int* ptr = 0;
int* ptr = NULL;  //<- 처럼 주소값에 0또는 NULL을 저장합니다.

이는 0번지를 의미하는 것이 아닌, 아무것도 가리키지 않는다를 의미한답니다.

 

 

포인터 설명을 위한 포스팅은 계속 됩니다. 다음 포스팅을 참고하시길 바랍니다

 

 

 

 

이 포스터는 윤성우 열혈 C 프로그래밍을 참고하여 작성하였습니다.

 

궁금한 점은 댓글로 물어보시길 바랍니다.

부족한 점이 많으니 태클 환영합니다!




+ Recent posts