without haste but without rest
[C] 구조체 본문
Reference - C언어 코딩도장
1. 구조체 기본 형태
C 언어는 클래스가 없다. 이 역할을 구조체가 하는 듯 하다.
struct Person {
char name[20];
int age;
char address[100];
};
2. 구조체 예제
1). 멤버를 직접 정의하기
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
struct Person {
char name[20]; // 구조체 멤버1
int age; // 구조체 멤버2
char address[100]; // 구조체 멤버3
}; // 구조체 정의 뒤에 변수를 붙이면 선언까지 한번에 할 수 있다.
int main()
{
struct Person p1; // 구조체 변수 선언
strcpy(p1.name, "홍길동");
p1.age = 30;
strcpy(p1.address, "대한민국");
printf("이름: %s\n", p1.name);
printf("나이: %d\n", p1.age);
printf("주소: %s\n", p1.address);
return 0;
}
2). 구조체 변수 선언과 동시에 값을 초기화 하기
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
struct Person {
char name[20]; // 구조체 멤버1
int age; // 구조체 멤버2
char address[100]; // 구조체 멤버3
};
int main()
{
struct Person p1 = { .name = "홍길동", .age = 30, .address = "서울" };
printf("이름: %s\n", p1.name);
printf("나이: %d\n", p1.age);
printf("주소: %s\n", p1.address);
return 0;
}
3-1). tpyedef로 struct 키워드 생략하고 구조체 선언하기
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
typedef struct _Person {
char name[20]; // 구조체 멤버1
int age; // 구조체 멤버2
char address[100]; // 구조체 멤버3
} Person;
int main()
{ // struct 키워드 없이 선언 가능
Person p1 = { .name = "홍길동", .age = 30, .address = "서울" };
printf("이름: %s\n", p1.name);
printf("나이: %d\n", p1.age);
printf("주소: %s\n", p1.address);
return 0;
}
3-2). 별칭을 사용하지 않는 경우
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
typedef struct _Person {
char name[20]; // 구조체 멤버1
int age; // 구조체 멤버2
char address[100]; // 구조체 멤버3
};
int main()
{
struct _Person p1 = { .name = "홍길동", .age = 30, .address = "서울" };
printf("이름: %s\n", p1.name);
printf("나이: %d\n", p1.age);
printf("주소: %s\n", p1.address);
return 0;
}
(4). 익명 구조체
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
typedef struct { // * 구조체 이름을 생략할 수 도 있다. -> 별칭으로 선언한다.
char name[20]; // 구조체 멤버1
int age; // 구조체 멤버2
char address[100]; // 구조체 멤버3
} Person;
int main()
{
Person p1 = { .name = "홍길동", .age = 30, .address = "서울" };
printf("이름: %s\n", p1.name);
printf("나이: %d\n", p1.age);
printf("주소: %s\n", p1.address);
return 0;
}
3. 구조체 포인터
1). 기본 예제
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct Person {
char name[20];
int age;
char address[100];
};
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);
printf("주소: %s\n", p1->address);
free(p1);
return 0;
}
* 구조체 포인터의 멤버에 값을 할당하고 호출하는 경우 . 대신 -> 을 사용한다.
* -> 화살표 연산자 (Arrow Operator)
* 포인터는 메모리 주소를 저장하므로 어떤 값이 있는 곳을 가르킨다. 그래서 화살표 연산자를 사용한다.
* . 으로 접근하고자 하는 경우 (*p1).age 형태로 접근할 수 있다.
2). 구조체 포인터에 동적 메모리 할당하기
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct Data {
char c1;
int* numPtr;
};
int main()
{
int num = 10;
struct Data d1; //구조체 변수
struct Data* d2 = malloc(sizeof(struct Data)); //구조체 포인터에 메모리 할당
d1.numPtr = #
d2->numPtr = #
printf("%d\n", *d1.numPtr); // 구조체의 멤버를 역참조
printf("%d\n", *d2->numPtr); // 구조체 포인터의 멤버를 역참조
d2->c1 = 'a';
printf("%c\n", (*d2).c1); // 구조체 포인터를 역참조하여 c1에 접근
printf("%d\n", *(*d2).numPtr); // 구조체 포인터를 역참조하여 numPtr에 접근하고 다시 역참조
// *d2->numPtr 과 같음
free(d2);
return 0;
}
* 별칭과 익명 구조체도 사용할 수 있다.
3). 구조체 포인터에 구조체 변수의 주소 할당하기
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct Data {
int age;
};
int main()
{
struct Data d1;
struct Data* ptr;
ptr = &d1;
ptr->age = 30;
printf("%d\n", d1.age);
printf("%d\n", ptr->age);
return 0;
}
'ProgrammingLanguage > C' 카테고리의 다른 글
[C] 열거형 (0) | 2020.02.29 |
---|---|
[C] 공용체 (0) | 2020.02.29 |
[C] sprintf / 버퍼 (0) | 2020.02.26 |
[C] 문자열 관련 함수 (0) | 2020.02.26 |
[C] 포인터 (0) | 2020.02.26 |
Comments