201303/포인터의 이해
2013. 4. 3. 16:58ㆍ프로그래밍/C언어 TIP
▣ 포인터의 이해
포인터(*)는 어딘가를 가리키기 위한 메모리의 값이다.
프로그램을 좀 더 수월하게 이해하기 위해서는 심볼테이블을 만들고 이해할 줄 알아야 한다.
위의 코드에서 보면 마지막 Printf문만 컴파일 에러나 발생한다는 걸 알 수 있다. 직접 입력하여 어떠한 컴파일 에러가 나는지 확인해보자.
위와 같은 에러가 발생하는 것을 알 수 있다. 그 이유는 A는 int형의 변수로 선언되었고, 포인트(*)변수로는 선언되지 않았기 때문이다. 또 하나 주의해야 할 점은 p = &A;라는 명령문이다. 같은 정수 주소값으로 생각하여 컴파일 에러는 발생하지 않지만 경고 메세지가 나타나게 된다. 그것은 서로 자료형이 같지 않기 때문에 생기는 경고 메세지이다. 경고 메세지를 없애기 위해서는 캐스팅을 해줘야 한다. 그러기 위해서 바로 심볼테이블이 필요한 것이다. 어떤 자료형의 포인터 변수인지를 알아야 캐스팅이 가능하다.
포인트(*)를 단항으로 취급받으려면 반드시 변수가 포인터로 선언되어야 한다. *는 다항연산자에서 쓰이기도 하지만 취급은 단항과 차이가 있다. *는 애스테리스크(asterisk)라고 불리기도 한다.
다음 예제는 short형의 포인트 변수가 int형의 데이터를 접근하는 프로그램이다.
먼저 심볼테이블을 그려보자.
inum은 int형 변수.
ip는 int형을 가리키는 포인트 변수.
sp는 short형을 가리키는 포인트 변수로 각각 선언되었다.
sp = sp + 1; 는 sp의 값을 2증가 시킨다. 왜냐하면 포인트 주소의 연산은 자료형의 크기만큼 더해지기 때문이다. short의 경우 2byte이므로 2만큼 증가하게 되는 것이다.
int형의 경우는 4가 증가하게 되는 것이다.
다음 소스 역시 서로 다른 자료형을 가리키게 되어 컴파일 단계에서 경고 메시지가 발생하고 실행에서는 잘못된 결과가 산출되는 것을 확인 할 수 있다.
위의 소스에서도 아까와 같은 경고 메시지가 뜨는 것을 확인 할 수 있다. 해결 방법은 역시
캐스팅을 해주면 된다.
다음 소스는 포인트변수의 초기화가 되지 않고 사용된 프로그램이다.
포인트변수의 초기화가 되어 있지 않아 가리키는 메모리가 없는 상태에서 대상 메모리에 대한 값을 부여 받게 되면 역시나 경고메세지가 뜨게 되고 실행도 정상적으로 진행되지 않는다.
직접 입력을 통해 어떻게 되지는 확인해보기 바란다.
포인터를 어떻게 쓸지는 프로그래머가 선택해야 하는 문제이다.
'프로그래밍 > C언어 TIP' 카테고리의 다른 글
201303/함수의 분리와 링크. 리눅스에서 make 사용 (0) | 2013.04.03 |
---|---|
201303/ 포인터 주소 값의 연산. 함수의 원형. 함수의 정의 (0) | 2013.04.03 |
201303/변수의 값과 주소. 포인터의 개념. littleendian (0) | 2013.04.03 |
201303/ getchar()와 getch() (0) | 2013.04.03 |
201303/for문 (0) | 2013.04.03 |