[C언어 스터디 - 05] 구조체와 포인터 (struct and pointer)
2020. 6. 25. 11:00ㆍ03. Resources/C, C++
728x90
반응형
구조체 포인터 사용하기
참고 문헌 (Ch 49) : https://dojang.io/mod/page/view.php?id=418
구조체 포인터를 선언하고 메모리 할당하기
다른 자료형과 마찬가지로 malloc 함수를 이용하여 동적 메모리 할당
할당하는 방법: struct 구조체이름 (*포인터이름) = malloc(sizeof(struct 구조체 이름));
예시
#include <stdio.h>
#include <string.h> // strcpy 함수가 선언된 헤더 파일
#include <stdlib.h> // malloc, free 함수가 선언된 헤더 파일
struct Person { // 구조체 정의
char name[20]; // 구조체 멤버 1
int age; // 구조체 멤버 2
char address[100]; // 구조체 멤버 3
};
int main()
{
struct Person *p1 = malloc(sizeof(struct Person)); // 구조체 포인터 선언, 메모리 할당
// 화살표 연산자로 구조체 멤버에 접근하여 값 할당
strcpy(p1->name, "홍길동");
p1->age = 30;
strcpy(p1->address, "서울시 용산구 한남동");
// 화살표 연산자로 구조체 멤버에 접근하여 값 출력
printf("이름: %s\n", p1->name); // 홍길동
printf("나이: %d\n", p1->age); // 30
printf("주소: %s\n", p1->address); // 서울시 용산구 한남동
free(p1); // 동적 메모리 해제
return 0;
}
참고: 구조체의 멤버가 포인터일 때 역참조를 하려면 맨 앞에 *를 붙여야 함. 이 때 구조체 변수 앞에 *가 붙어있더라도 멤버의 역참조이지 구조체 변수의 역참조가 아님.
예시
#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; // d1의 numPtr에 &num1을 할당
d2->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과 같음
printf("%d\n", d2->numPtr); // 비교를 위한 코드
printf("%d\n", *d2->numPtr); // 비교를 위한 코드
free(d2);
return 0;
}
구조체 별칭으로 포인터를 선언하고 메모리 할당하기
구조체 별칭을 이용하여 구조체 포인터의 메모리 할당 방법: (구조체 별칭) (*포인터 이름) = malloc(sizeof(구조체 별칭))
#include <stdio.h>
#include <string.h> // strcpy 함수가 선언된 헤더 파일
#include <stdlib.h> // malloc, free 함수가 선언된 헤더 파일
typedef struct _Person { // 구조체 이름은 _Person
char name[20]; // 구조체 멤버 1
int age; // 구조체 멤버 2
char address[100]; // 구조체 멤버 3
} Person; // typedef를 사용하여 구조체 별칭을 Person으로 정의
int main()
{
Person *p1 = malloc(sizeof(Person)); // 구조체 별칭으로 포인터 선언, 메모리 할당
// 화살표 연산자로 구조체 멤버에 접근하여 값 할당
strcpy(p1->name, "홍길동");
p1->age = 30;
strcpy(p1->address, "서울시 용산구 한남동");
// 화살표 연산자로 구조체 멤버에 접근하여 값 출력
printf("이름: %s\n", p1->name); // 홍길동
printf("나이: %d\n", p1->age); // 30
printf("주소: %s\n", p1->address); // 서울시 용산구 한남동
free(p1); // 동적 메모리 해제
return 0;
}
구조체 포인터에 구조체 변수의 주소 할당하기
동적 메모리를 할당하지 않고 구조체 포인터를 사용하는 방법: (구조체 포인터) = (&구조체 변수)
#include <stdio.h>
struct Person { // 구조체 정의
char name[20]; // 구조체 멤버 1
int age; // 구조체 멤버 2
char address[100]; // 구조체 멤버 3
};
int main()
{
struct Person p1; // 구조체 변수 선언
struct Person *ptr; // 구조체 포인터 선언
ptr = &p1; // p1의 메모리 주소를 구하여 ptr에 할당
// 화살표 연산자로 구조체 멤버에 접근하여 값 할당
ptr->age = 30;
printf("나이: %d\n", p1.age); // 나이: 30: 구조체 변수의 멤버 값 출력
printf("나이: %d\n", ptr->age); // 나이: 30: 구조체 포인터의 멤버 값 출력
return 0;
}
반응형
'03. Resources > C, C++' 카테고리의 다른 글
[C언어 스터디 - 07] 구조체 배열 (struct array) (0) | 2020.06.27 |
---|---|
[C언어 스터디 - 06] 구조체 멤버값 설정 (memset) (0) | 2020.06.26 |
[C언어 스터디 - 04] 구조체 (struct) (0) | 2020.06.24 |
[C언어 스터디 - 03] 배열과 포인터 (array and pointer) (0) | 2020.06.23 |
[C언어 스터디 - 02] 2차원 배열 (2D Array) (0) | 2020.06.22 |