struct 구조체이름 {
자료형 멤버이름;
};
struct 구조체이름 {
자료형 멤버이름;
} 변수;
struct Person { // 구조체 정의
char name[20]; // 구조체 멤버 1
int age; // 구조체 멤버 2
char address[100]; // 구조체 멤버 3
};
#include <stdio.h>
void main(void)
{
struct Person p1; // 구조체 변수 선언
// 점으로 구조체 멤버에 접근하여 값 할당
strcpy(p1.name, "kiki");
p1.age = 1000;
strcpy(p1.address, "올로로로");
// 점으로 구조체 멤버에 접근하여 값 출력
printf("이름: %s\n", p1.name); // 이름: kiki
printf("나이: %d\n", p1.age); // 나이: 1000
printf("주소: %s\n", p1.address); // 주소: 올로로로
}
typedef struct 구조체이름 {
자료형 멤버이름;
} 구조체별칭;
//typedef는 자료형의 별칭을 만드는 기능, 구조체 포함 모든 자료형의 별칭 가능
typedef struct { // 구조체 이름이 없는 익명 구조체
char name[20]; // 구조체 멤버 1
int age; // 구조체 멤버 2
char address[100]; // 구조체 멤버 3
} Person; // typedef를 사용하여 구조체 별칭을 Person으로 정의
구조체 포인터
- struct 구조체이름 *포인터이름 = malloc(sizeof(struct 구조체이름));
struct Person { // 구조체 정의 char name[20]; // 구조체 멤버 1 int age; // 구조체 멤버 2 char address[100]; // 구조체 멤버 3 }; void main(void) { struct Person *p1 = malloc(sizeof(struct Person)); // 구조체 포인터 선언, 메모리 할당 // 화살표 연산자로 구조체 멤버에 접근하여 값 할당 strcpy(p1->name, "kikiki"); p1->age = 100; // 화살표 연산자로 구조체 멤버에 접근하여 값 출력 printf("이름: %s\n", p1->name); // kikiki printf("나이: %d\n", p1->age); free(p1); // 동적 메모리 해제 }
구조체의 멤버에 접근하는 방법
. (점)을 사용해서 멤버에 접근했지만 구조체 포인터의 멤버에 접근할 때는 -> (화살표 연산자 : arrow operator)를 사용
p1->age; // 화살표 연산자로 멤버에 접근
(*p1).age; // 구조체 포인터를 역참조한 뒤 .으로 멤버에 접근
// (*p1).age와 같이 구조체 포인터를 역참조하면
// pointer to struct Person에서 pointer to가 제거되서 struct Person이 됨
구조체의 멤버가 포인터일 때 역참조
구조체의 멤버가 포인터일 때 역참조를 하려면 맨 앞에 *를 붙임
이때 구조체 변수 앞에 *가 붙어있더라도 멤버의 역참조이지 구조체 변수의 역참조가 아님
- *구조체변수.멤버
- *구조체포인터->멤버
https://dojang.io/mod/page/view.php?id=418
'1 > C' 카테고리의 다른 글
가변 인수 (0) | 2021.10.10 |
---|---|
strdup substr memmove strlcpy strlcat (0) | 2021.07.03 |
parameter / argument (0) | 2021.06.19 |
size_t / ssize_t (0) | 2021.06.10 |
파일 입출력 관련 함수 | open() close() read() lseek() (0) | 2021.06.07 |