#include <stdio.h>
#include <stdlib.h>
struct Data {
char c1;
int num1;
};
int main()
{
struct Data* d1 = malloc(sizeof(struct Data));
void* ptr;
d1->c1 = 'a';
d1->num1 = 10;
ptr = d1;
printf("%c\n", ((struct Data*)ptr)->c1);
printf("%d\n", ((struct Data*)ptr)->num1);
free(d1);
return 0;
}
왜 ptr=d1이라고 해야하나요? ptr = &d1이라고 해야하지 않나요? 포인터는 주소를 담아야 하므로 &을 붙여주어야 하지 않나요? 잘 모르겠네요...
본문의 설명을 다시 인용합니다.
그다음에 ptr = d1;과 같이 ptr에 d1을 할당했습니다. 여기서 ptr은 void 포인터이고 d1은 Data 구조체 포인터이지만, void 포인터는 포인터 타입을 가리지 않고 다 받아들일 수 있으므로 컴파일 경고가 발생하지 않습니다(암시적으로 자료형 변환이 되기 때문).
d1은 포인터입니다. pointer to struct Data입니다. 포인터는 주솟값입니다.
void 포인터는 주솟값을 받습니다. 포인터 타입을 가리지 않습니다.
d1이 pointer to struct Data이고,
&d1이라고 쓰면 address of pointer to struct Data가 됩니다.
pointer가 이미 주소이기 때문에 주소의 주소인데
이렇게 쓰고 싶다면
pointer to void가 아니라
pointer to pointer to void여야 하고,
이는 void**로 선언되어야 한다는 뜻입니다.
포인터에서 설명한 그림을 스스로 그리고 이해할 수 있어야 합니다.
UNIT 34부터 학습해야 합니다.
지금 중도 학습자라서 중간에 가입해서 중간부터 보면 이해하지 못하는 게 당연합니다.
<C 언어 코딩 도장>은 순차 학습을 위해 설계되어 있습니다.
순차적으로 학습하면 이런 종류의 질문이 나오지 않습니다.
다른 C 언어 책은 무시하세요.
C 언어 명세서와 그 명세서의 표현을 따라
pointer to type 표기법부터 설명하는 <C 언어 코딩 도장>으로 포인터를 제대로 이해하세요.
포인터를 자기식대로 해석하고, 자기식대로 설명한 C 언어 입문서는 올바른 지식을 전달하지 않습니다.