나미/C

18. Point와 Symbol Table

규남 2013. 3. 20. 11:22
반응형

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  12ff60 
int *  12ff70 

이 그림을 보통 심볼테이블이라고 하는데 변수를 선언하면 그에 해당하는 변수의 타입과 변수명, 주소를 말하는 것이다.

 

소스코드를 코딩하다보면 타입에 따라 영향을 많이 받는다. 특히 오류나 경고가 뜰 경우에 타입에 따라서 경고가 틀리게 뜬다.

 

예를 들면

 

p = 10; 이라고 선언하고 봤을 경우에 변수 p의 타입은 포인트 타입이다. 따라서 형이 서로 맞지 않다고 경고창이 뜨게 된다. (printf함수로 값을 호출했을 경우)

따라서 형을 *p = 10;이라고 하면 경고가 사라진다.

 

a = 10; 이라고 선언하고 봤을 경우에 변수 a의 타입은 int 타입이므로 오류가 발생하지 않는다.

반대로 *a = 10;이라 코딩을 넣었다면 경고창이 아닌 컴파일 에러 메세지가 뜨게 된다.

 

이유는 a가 int타입이므로 앞에 *은 포인트로 인식하는것이 아니라 곱셈으로 인식하게 되므로 연산할 값이 없다고 에러 메세지가 뜨고 실행이 되지 않는다.

 

그렇기 때문에 반드시 심볼테이블을 머리에 숙지하고 있어야 한다. 경우에 따라 여러가지로 보여질수 있기 때문에 꼭 알아두길 바란다.

 

 

 

 

 

728x90
반응형