2016. 2. 23. 08:41


포인터 *


포인터란 어떠한 값을 저장하는게 아닌 어떠한 값의 주소(Address)를 저장하는 것 입니다


어떠한 값의 주소는 컴퓨터 메모리의 주소를 의미합니다.

1
2
3
4
5
6
7
8
#include<stdio.h>
 
void main()
{
    int num = 0;
    int *pnum = &num;
    //pnum은 num의 주소값을 가지고 있다.
}
cs


포인터 변수를 선언하기 위해서는 변수이름 앞에 *을 붙여서 선언하면 그 변수는 포인터 변수가 됩니다.


대체로 포인터인걸 알리기위해 변수병 앞에 소문자로 p를 붙이기도 합니다. 하지만 이건 코드 스타일이니.. 각자 알아서..


아직 이해가 잘 안되실텐데, 포인터 변수를 이용하여, 주소값과 포인터의 관계를 나타낸 예제입니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include<stdio.h>
 
int main(void)
{
    int *pnum;         // 포인터 변수 선언
    int num = 10;     // 일반변수 선언 & 초기화
    pnum = &num;     // num의 주소값을 pnum에 저장
 
    printf("num의 값: %d\n", num);
    printf("num변수의 주소:%p\n", &num);
    printf("pnum변수의 값 :%p\n", pnum);
    printf("pnum이 가리키는 값: %d\n"*pnum);
 
/*
결과값
num의 값: 10
num변수의 주소:001919fC
pnum변수의 값 :001919fC
pnum이 가리키는 값: 10
*/
}

cs


밑에 주석처리한 결과값을 보면 pnum은 num의 주소값을 가리킨다는것을 알수있습니다.

즉 pnum이 가진 주소값의 위치로 찾아가면 num의 값을 얻을수있다는 것입니다.

주소값의 위치를 찾기위해선, 포인터 선언때 사용했던 * 연산자를 변수 명 앞에 적어주면 됩니다.


그럼 여기서 num의 값이 변화한다면 어떻게 될까요?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include<stdio.h>
 
int main(void)
{
    int *pnum;         // 포인터 변수 선언
    int num = 10;     // 일반변수 선언 & 초기화
    pnum = &num;     // num의 주소값을 pnum에 저장
 
    printf("num의 값: %d\n", num);
    printf("num변수의 주소:%p\n", &num);
    printf("pnum변수의 값 :%p\n", pnum);
    printf("pnum이 가리키는 값: %d\n"*pnum);
    printf("num값 증가 +10 \n");
    num+=10;
    printf("pnum이 가리키는 값: %d\n"*pnum);
 
/*
결과값
num의 값: 10
num변수의 주소:001919fC
pnum변수의 값 :001919fC
pnum이 가리키는 값: 10
num값 증가 +10
pnum이 가리키는 값: 20
*/
}

cs


주석 처리된 출력값을 보면 마지막에 num의 값이 증가했는데 pnum이 가리키는 값 또한 증가한걸 볼수있습니다.

당연하겠죠?

이해가 안된다면, pnum이 가지고있는 값은 주소값이며, *pnum으로 가리키는 주소로 갔더니 값이 있어서 그걸 출력한것뿐입니다.


집주소를 알고있지만, 같은 주소에 다른사람이 살고있는것과 같겠죠?




◎ 포인터의 초기화


포인터의 초기값은 무엇으로 해야할까요? 

1
2
3
4
5
6
7
#include<stdio.h>
 
int main(void)
{
    int *pnum;         // 포인터 변수 선언
    *pnum = 100;
}

cs

위와 같이 코딩해 실행한다면 어떻게 될까요?

물론 컴파일러의 도움을 받아서 컴파일을 해주지 않겠지만, 이론대로라면 초기화 되지않은 포인터 변수는 쓰레기값.. 어딘지 모르는 주소값을 가지고있어서, 컴퓨터가 사용하는 어느 일정 부분의 메모리를 갑자기 100으로 덮어씌울수도있고, 그에따라 치명적인 오류를 뱉어 낼수도있습니다.


따라서 포인터 변수의 초기화는 NULL 또는 0 으로 하면 됩니다.

1
2
3
4
5
6
7
#include<stdio.h>
 
int main(void)
{
    int *pnum01 = null;         // 포인터 변수 선언
    int *pnum02 = 0;         // 포인터 변수 선언
}
cs

NULL은 아스키 코드값으로 0을 나타내며, 포인터 변수에 들어간 0은 0번째 주소를 가리키는게 아닌, "아무것도 없다." 라는 뜻을 지니게 됩니다.






Posted by 시리시안