예전에 C 배울때는 그냥 무심결에 이해하고 넘어간 것 같은데
지금와서 생각해보니
int형 변수의 주소건, int *형 변수의 주소건, 이 둘의 주소는 특별한 차이가 없을것 같아.(그렇게 생각함)
단지 int *의 의미는, int *형 변수가 가리키는(addressing) 것은 데이터(operand)다! 라고 컴파일러한테 알
려주는거야
그럼 int **의 의미는?
int **형 변수가 가리키는(addressing) 것은 operand의 address이다! 라고 컴파일러한테 알려주는거지.
그래서 int **형 변수로는 참조를 두 번 할 수 있게됨.
실제로
int * sptr;
int ** dptr = &sptr;
다음과 같은 문장은
int * sptr;
int * dptr = &sptr;
이렇게 바꾸고 컴파일 해도 컴파일 에러가 발생하지 않고,
dptr을 대상으로 *dptr을 해도 옳은 결과(sptr의 값)이 나오게됨.
근데 문제는 dptr을 대상으로 참조를 두번하는 경우인데 (**dptr)
컴파일러는 dptr이 어드레싱 하는 것은 operand이다! 라고 생각하고 있는데, operand를 가지고 다시 참조를
하려고 시도하니까
이부분에서 간접참조가 잘못되었다는 컴파일 에러를 발생시키는거지.
------------------------------------------------------------------------------------------
참고 :
- C에서는 이러한 캐스팅을 내부적으로 알아서 해주지만, C++에서는 오류를 낸다. (int ** -> int *)
- 어떤 변수도 (int ************) 로 캐스팅할 수 있다.
- &<lvalue>의 타입은 type(<lvalue>)*이다
'C > 공개글' 카테고리의 다른 글
리틀엔디안에 따른 순서의 문제 (0) | 2013.04.14 |
---|---|
시프트 연산자(shift operation) (0) | 2013.04.13 |
WSAGetLastError() 호출 후 10038이 반환되는 경우 (0) | 2013.03.04 |
프롬프트창에서 실행 시 fopen 에러가 나는 이유? (0) | 2013.02.19 |
if(a==0) 와 if(0==a)의 차이? (0) | 2013.01.23 |