보통 구조체는 멤버 변수가 여러 개 들어있어서 크기가 큰 편입니다. 그래서 구조체 변수를 일일이 선언해서 사용하는 것보다는 포인터에 메모리를 할당해서 사용하는 편이 효율적입니다.
1. 구조체 포인터 기본
1) 동적 메모리 할당
1> 구조체 포인터를 선언
2> 그 구조체의 크기만큼 malloc 함수로 메모리를 할당
struct '구조체이름'* '구조체 포인터 이름' = malloc(sizeof(struct '구조체 이름'));
2) 구조체 멤버에 접근
1> .(점)이 아닌 ->(화살표 연산자)를 이용
2> 예시
'구조체 포인터 이름'->'구조체 멤버'
3> .(점)으로 접근하는 방법
(*'구조체 포인터 이름').'구조체 멤버'
// 0. 구조체 정의
struct Person { // 구조체 정의
char name[20]; // 구조체 멤버 1
int age; // 구조체 멤버 2
};
// 1. 구조체 포인터 (선언 및 메모리 할당)
struct Person *p1 = malloc(sizeof(struct Person));
// 2. 멤버에 접근
strcpy(p1->name, "홍길동");
p1->age = 30;
3) 구조체의 멤버가 포인터일 때
1> *(역참조 연산자)를 사용한다.
2> 포인터인 멤버의 역참조이지 구조체 변수의 역참조가 아닙니다.
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); // 10: 구조체의 멤버를 역참조
printf("%d\n", *d2->numPtr); // 10: 구조체 포인터의 멤버를 역참조
d2->c1 = 'a';
printf("%c\n", (*d2).c1); // a: 구조체 포인터를 역참조하여 c1에 접근
// d2->c1과 같음
printf("%d\n", *(*d2).numPtr); // 10: 구조체 포인터를 역참조하여 numPtr에 접근한 뒤 다시 역참조
// *d2->numPtr과 같음
free(d2);
return 0;
}
2. typedef와 구조체 포인터
1) 동적 메모리 할당
1> 이번에도 'struct 구조체 이름' 부분을 '구조체 별칭'으로 대체한다.
'구조체 별칭'* '구조체 포인터 이름' = malloc(sizeof(struct '구조체 이름'));
2) 구조체 멤버에 접근
(이전 방법과 동일하다.)
1> .(점)이 아닌 ->(화살표 연산자)를 이용
2> 예시
'구조체 포인터 이름'->'구조체 멤버'
3> .(점)으로 접근하는 방법
(*'구조체 포인터 이름').'구조체 멤버'
// 0. 구조체 정의
typedef struct _Person { // 구조체 이름은 _Person
char name[20]; // 구조체 멤버 1
int age; // 구조체 멤버 2
} Person;
// 1. 구조체 포인터 (선언 및 메모리 할당)
Person *p1 = malloc(sizeof(Person));
// 2. 멤버 접근
strcpy(p1->name, "홍길동");
p1->age = 30;
(익명 구조체도 '2. typedef' 와 동일하게 사용합니다.)
cf> 동적 메모리 할당 이외의 방법도 활용해본다.
구조체 포인터에 바로 구조체 변수의 주소를 할당한다.
3. 구조체 포인터에 구조체 변수의 주소 할당
0) 사전 작업
1> 구조체 정의
2> 구조체 변수, 구조체 포인터 선언
1) 구조체 포인터에 구조체 변수의 메모리 주소 할당
'구조체 포인터 이름' = &'구조체 변수'
2) 구조체 멤버에 접근
(이전 방법과 동일하다.)
1> .(점)이 아닌 ->(화살표 연산자)를 이용
2> 예시
'구조체 포인터 이름'->'구조체 멤버'
3> .(점)으로 접근하는 방법
(*'구조체 포인터 이름').'구조체 멤버'
// 0. 구조체 정의
struct Person { // 구조체 정의
char name[20]; // 구조체 멤버 1
int age; // 구조체 멤버 2
};
int main()
{
// 0. 구조체 변수, 구조체 포인터 선언
struct Person p1; // 구조체 변수 선언
struct Person *ptr; // 구조체 포인터 선언
// 1. 구조체 포인터에 구조체 변수의 메모리 주소 할당
ptr = &p1; // p1의 메모리 주소를 구하여 ptr에 할당
// 2. 구조체 멤버 접근
ptr->age = 30;
printf("나이: %d\n", p1.age); // 나이: 30: 구조체 변수의 멤버 값 출력
printf("나이: %d\n", ptr->age); // 나이: 30: 구조체 포인터의 멤버 값 출력
return 0;
}
'C언어' 카테고리의 다른 글
11-1강 - 구조체 기본 (0) | 2020.04.09 |
---|---|
9강 - Pointer Application (0) | 2020.03.31 |
3강 - 함수 (function) (0) | 2020.03.02 |
2강 - structure of a C program (0) | 2020.03.02 |
1강 - Introduction to C (0) | 2020.03.02 |