구조체에 포인터를 사용해서 맴버 변수에 접근하고 싶을 때 어떻게 하면 좋을까?
구조체 변수를 일일이 선언해서 사용하는 것보다는 구조체 포인터를 선언하고 malloc함수를 사용해서 구조체 포인터에 동적 메모리를 할당한 다음 화살표 연산자나 -> .(점)을 사용해서 구조체 멤버의 값에 접근한다.
구조체안에 있는 멤버 변수들
struct Data{
char c1;
int *numPtr;
};
1. 먼저 구조체 포인터를 선언하고 malloc 함수를 사용해 동적 메모리를 할당한다.
ex) struct Data *d2 = malloc(sizeof(struct Data));
2. 여기서 역참조 하는것에 괄호를 붙이면 구조체 포인터를 역참조한 뒤 .(점)을 사용하여 맴버에 접근할 수 있다.
ex) 구조체 포인터의 예
*(*d2).numPtr;
설명: d2의 구조체 포인터를 역참조 한 뒤 .(점)을 사용해 numPtr멤버 변수에 접근 뒤 *numPtr멤버 변수를 역참조
또 구조체 포인터에 괄호를 붙이고 .(점)을 사용하면 구조체 포인터가 일반변수로 바뀌게 된다.
ex) 구조체 포인터에서 일반변수로 바뀐 예시
(*d2).c1
설명: 괄호를 붙이고 점연산자를 사용하게 되면 d2의 구조체 포인터가 일반 변수로 바뀌게 되므로 바뀐 d2의 변수가 구조체 안에 있는 c1의 멤버 변수를 가리키게 된다. ( d1 -> c1 )
#include <stdio.h>
#include <stdlib.h>
struct Data {
char c1;
int *numPtr; // 포인터
};
int main()
{
int num1 = 10;
struct Data d1; // 구조체 변수
struct Data *d2 = malloc(sizeof(struct Data)); // 구조체 포인터에 동적 메모리 할당
d1.numPtr = &num1;
d2->numPtr = &num1;
printf("%d\n", *d1.numPtr); // 구조체변수에 numPtr맴버 변수를 역참조 , 결과는 10
printf("%d\n", *d2->numPtr); // 구조체 포인터의 맴버를 역참조 , 결과는 10
d2->c1 = 'a';
// 구조체 포인터로 역참조 뒤에 구조체 멤버변수 char c1 접근
// d2->c1이랑 같음
// 값은 a
printf("%c\n",(*d2).c1);
// 구조체 포인터로 역참조 뒤 구조체 안에 있는 numPtr변수에 접근한 뒤 다시 역참조
// *d2->numPtr과 같다.
// 값은 10
printf("%d\n", *(*d2).numPtr);
// 마지막으로 구조체를 다 사용했으면 free함수로 d2메모리를 해제
free(d2);
return 0;
}