질문글중하나가
struct A ....
struct B { A* val ...
이렇게했을때
B b;
b.A->(A inner data) 이렇게접근하는걸 b.(*A).(innerVal) 이렇게 안되는걸 물어보는사람이있던데 책을 한번 정독하는걸 추천함
물론 val->(InnerData) 를 에스터리스크를 이용해서 (*val).따위로 쓸수있음. 이게 되는이유가 참조 역참조의 관계인데
val 자체는 구조체 A의 주소를 가르킴. 즉 int* 와같은 포인터변수로 딱 4바이트 크기만큼의 변수다 그거야.
여기서 *val을 붙이는 의미는 이 변수를 주소가아닌 이 주소가 가르키고있는 변수로 읽겠단소리 그러니까 역 참조 하겠단소리임.
물론 연산자는 후치가 우선되기때문에 정확하게 쓰기 위해서 역참조된 변수 *val 을 괄호로 감싸줘야함
*val.(inner Data)로 해버리면 .연산자가 우선되기 때문에 val.Inner Data를 역참조시켜버리기 때문이지.
그럼 b.A->innerData 같은 경우 하나하나 잘풀어보면됨 b.A를 하나로 묶어서 치환시키면 (*C).InnerData가됨
여기서 C = b.A와 같지 좀더 정확하게 쓰자면 (*b.A).Inner Data 가되는거야 여기서 메인변수는 b고 이 b가 가지고있는 A는 포인터변수지
b.A의 에스터리스크 * 를붙이면 b.A가 가르키고있는 struct A를 가르키고 있는 주소를 역참조 시키고 이 역참조된 변수는 . 연산자로접근할수있으니
위와같이쓰는거임. 니가말한 b.(*A).InnerVal 은 문법적으로 말이안되는거임. b에 속해있는 멤버필드 A를 접근하는데 여기에 역참조 에스터링스크가 붙어있다??
문법적으로 말이안되지. 암튼 포인터 책을 다시 보기바람
*를 왜 역참조라고 부름? 설명을 어렵게 하네
기러서