Point의 의미
Point는 내가 원하는 특정 주소의 값을 지정하여 사용할때 쓰인다. 하나하나 메모리 주소를 적기 어려우므로 Point변수를 사용하여 손쉽게 이용할수 있다. 예를 들어 확인해보자.
int a;
int *p;
a = 10;
p = &a;
printf("변수 a의 값 : %d". a); a의 값을 그대로 출력한다. 즉 10이라는 결과값이 출력된다.
printf("변수 a의 주소값 : %p", &a); a의 주소값이 16진수로 0x12ff60 라는 주소값이 출력된다.
printf("변수 p의 주소값 : %p", p); p를 찍었지만 p가 가르키는것은 a의 주소이므로 바로위의 주
소값인 0x12ff60 라는 주소값이 출력된다.
printf("변수 *p의 값 : %d", *p); *p를 찍으면 p가 가르키는 주소로 가서 그 값을 가져온다.
따라서 a주소로 넘어가서 그안에 들어있는 10의 값을 출력.
처음 접하는 사람은 어려울수가 있다. 더쉽게 설명을 말로 풀어서 하자면
p = 99; 라고 할경우에 p에 99라는 값을 대입하는 것이고, *p = 99; 라고 포인트변수로 선언할 경우에는 p가 가르키는 주소로 이동하여 그 해당하는 주소에 99라는 값을 넣는것이다.
Symbol Table
심볼 테이블의 경우는 반드시 숙지하는것이 좋다. 앞에서부터 차례로 설명을 쭉 읽어 왔다면 쉽게 알수 있다.
타입 | 이름 | 주소 |
int | a | 12ff60 |
int * | p | 12ff70 |
이 그림을 보통 심볼테이블이라고 하는데 변수를 선언하면 그에 해당하는 변수의 타입과 변수명, 주소를 말하는 것이다.
소스코드를 코딩하다보면 타입에 따라 영향을 많이 받는다. 특히 오류나 경고가 뜰 경우에 타입에 따라서 경고가 틀리게 뜬다.
예를 들면
p = 10; 이라고 선언하고 봤을 경우에 변수 p의 타입은 포인트 타입이다. 따라서 형이 서로 맞지 않다고 경고창이 뜨게 된다. (printf함수로 값을 호출했을 경우)
따라서 형을 *p = 10;이라고 하면 경고가 사라진다.
a = 10; 이라고 선언하고 봤을 경우에 변수 a의 타입은 int 타입이므로 오류가 발생하지 않는다.
반대로 *a = 10;이라 코딩을 넣었다면 경고창이 아닌 컴파일 에러 메세지가 뜨게 된다.
이유는 a가 int타입이므로 앞에 *은 포인트로 인식하는것이 아니라 곱셈으로 인식하게 되므로 연산할 값이 없다고 에러 메세지가 뜨고 실행이 되지 않는다.
그렇기 때문에 반드시 심볼테이블을 머리에 숙지하고 있어야 한다. 경우에 따라 여러가지로 보여질수 있기 때문에 꼭 알아두길 바란다.
'나미 > C' 카테고리의 다른 글
23. 배열 (0) | 2013.04.03 |
---|---|
22. 함수선언과 정의 (0) | 2013.03.28 |
21. 비트연산자 (0) | 2013.03.25 |
20. 메모리를 구성하는 5가지 영역 (0) | 2013.03.21 |
19. IEEE 754 표준 - float, double형의 실수저장방식 (0) | 2013.03.21 |
17. 제어문 - 반복문, getch()와 getche() (0) | 2013.03.15 |
16. 제어문 - 복합문, 선택문 (0) | 2013.03.14 |
15. 제어문과 변수선언 및 초기화 (0) | 2013.03.13 |
14. 관계연산자와 논리연산자 (0) | 2013.03.12 |
13. 복합 대입 연산자와 증감 연산자 (0) | 2013.03.12 |