예전에 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>)*이다






Posted by huammmm1
,