티스토리 뷰
2021.03.05.금
구조체 선언과 멤버 사용
✔ 구조체는 사용자가 임의로 정의한 자료형이라고 볼 수 있다.
✔ 구조체를 선언하면 새로운 자료형이 만들어지고, 그 이후부터는 구조체 변수를 만들어 사용할 수 있다.
struct student{
int num;
double grade;
};
✔ 구조체는 struct 예약어를 사용해 선언한다.
✔ 구조체의 이름은 성격에 맞는 적절한 이름을 붙이고, 중괄호 내부 블록 안에 필요한 멤버를 나열한다.
✔ 멤버 선언은 구조체를 구성하는 자료형 종류와 이름을 컴파일러에게 알리는 역할을 한다.
✔ 선언 형태는 변수와 유사하나, 메모리 저장 공간을 할당받지 않는다는 차이점이 있다.
✔ 그리고 마지막으로 중괄호로 블록을 닫아준 뒤에는 반드시 세미콜론을 붙여야 한다.
#include <stdio.h>
//구조체 만들기
struct student{
int num;
double grade;
};
int main(void){
struct student s1; //구조체 참조 변수 선언
s1.num=2; //멤버 num 초기화
s1.grade=2.7; //멤버 grade 초기화
printf("학번 : %d\n", s1.num); // num 멤버 출력
printf("학점 : %.1lf\n", s1.grade); // grade 멤버 출력
return 0;
}
✔ 구조체를 만든 다음, 메인 함수 내부에서 구조체 변수를 만들어 구조체의 멤버에 접근할 수 있다.
✔ 구조체 변수를 선언해야 비로소 저장 공간이 할당되고, 멤버의 공간도 메모리에 연속으로 할당된다.
✔ 모든 멤버를 더한 전체 저장 공간이 하나의 구조체 변수가 되므로, 크기는 각 멤버의 크기를 더한 합이 된다.
✔ 구조체 변수는 그 안에 여러 멤버를 가지므로, 특정 멤버를 골라서 사용하기 위해 멤버 접근 연산자. 를 사용한다.
다양한 구조체 멤버
struct profile {
char * name[20]; //이름
int age; // 나이
double height; // 키
char *intro;
};
✔ 구조체 멤버로 변수뿐만 아니라 배열, 포인터는 물론이고 이미 선언된 다른 구조체도 사용할 수 있다.
✔ 배열이 구조체 멤버인 경우, 구조체 변수를 선언하면 배열 멤버도 그 크기만큼 저장 공간이 할당된다.
✔ 변수가 아닌 멤버를 사용할 때에도 멤버 접근 연산자. 을 사용한다.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct profile{
char * name[20];
int age;
double height;
char *intro;
};
int main(void){
struct profile yuni;
strcpy(yuni.name,"서하윤");
yuni.age = 17;
yuni.height = 164.5;
//구조체 멤버 char형 포인터는 메모리공간을 할당해야 사용할 수 있다.
yuni.intro = (char*)malloc(sizeof(char)*80) ;
printf("자기소개 : ");
gets(yuni.intro);
printf("이름 : %s\n", yuni.name);
printf("나이 : %d\n", yuni.age);
printf("키 : %.1lf\n", yuni.height);
printf("자기소개 : %s\n", yuni.intro);
free(yuni.intro);
return 0;
}
✔ char형 포인터를 멤버로 사용해 문자열을 저장할 수 있지만 키보드로 바로 입력할 수 없다.
✔ 포인터는 문자열 자체를 저장할 공간이 없으므로, 따로 동적 할당을 하고 난 뒤에 주소를 저장할 수 있다.
✔ 포인터 멤버는 배열 멤버보다 사용이 번거롭지만, 동적으로 사용할 수 있다는 장점이 있다.
✔ 각각의 장점이 있으므로 필요에 따라 적절한 멤버를 사용하자.
구조체의 멤버로 다른 구조체 사용하기
struct profile{
int age;
double height;
};
struct student{
int grade;
int class;
struct profile pf;
};
✔ 구조체(student) 멤버로 다른 구조체(profile)를 사용하려면 멤버가 될 구조체가 먼저 선언되어 있어야 한다.
struct student kuku;
kuku.grade=3;
kuku.class=10;
kuku.pf.age=19;
kuku.pf.height=162.5;
✔ student 구조체의 구조체 변수를 만들어 profile 구조체 멤버에 접근하기 위해서는 멤버 접근 연산자. 를 2번 사용해야 한다.
✔ 첫 번째 멤버 접근 연산을 통해 student 구조체 내부의 멤버인 pf에 접근하고
✔ 두 번째 멤버 접근 연산을 통해 profile 구조체 내부의 멤버에 접근할 수 있다.
[참고] 한빛미디어-혼자 공부하는 C언어 유튜브 강의 / 엘리스 트랙-혼자 공부하는 C언어 / 길벗-C언어 코딩 도장 / 위키백과
'BackEnd > C' 카테고리의 다른 글
[23일차] 1. 구조체 배열/자기 참조 구조체 (0) | 2021.03.06 |
---|---|
[22일차] 2. 구조체 변수 활용 (0) | 2021.03.05 |
[21일차] 2. 동적 할당의 활용 / 명령행 인수 (0) | 2021.03.04 |
[21일차] 1. 동적 메모리 할당 함수 (0) | 2021.03.04 |
[20일차] 5. 함수 포인터/void 포인터 (0) | 2021.03.03 |