구조체(structure)
서로 다른 자료형을 갖는 자료들의 모임
하나로 자료형으로 정의하여 사용 (사용자 정의 자료형)
#구조체 형식
struct 구조체명 변수명1,변수명2,변수명3;
struct score{
char no[4];
char name[8];
int kor;
int eng;
int math;
int hist;
}X,Y; //X,Y는 struct score의 구조체 변수
typedef struct score{
char no[4];
char name[8];
int kor;
int eng;
int math;
int hist;
}jumsu; //struct score를 jumsu라는 새로운 자료형으로 정의
jumsu X,Y;
//또는
struct person{
char name[8];
int age;
char sex;
} X={“홍길동”,20,‘M’};
#include <stdio.h>
#include <string.h>
struct student { // 구조체 student 정의
char name[30]; // 구조체 멤버 선언
char phone[20];
char address[100];
};
int main(){
struct student info; // 구조체 변수 info 선언
strcpy(info.name, "장원영");
strcpy(info.phone, "01-234-5678");
strcpy(info.address, "서울시 종로구");
printf("이름: %s \n", info.name);
printf("전화: %s \n", info.phone);
printf("주소: %s \n", info.address);
}
# 구조체 기억공간 구조
- 실제로 메모리가 할당될 때는 구조체 멤버 중 가장 큰 자료형의 크기로 할당됨
- int 4byte
- char 1byte
- short int 2byte
- double 8byte
# 구조체 배열
동일한 구조를 갖는 구조체 변수가 여러 개 사용 될 때,
그 구조체 변수들을 대표하는 배열명을 설정하여 일반 배열과 같이 사용.
[실습] 구조체 배열 프로그램
#include <stdio.h>
#include <stdlib.h> //자료변환 함수의 원형을 갖고있는 헤더 파일
struct s_type{
char name[40];
char phone[14];
int hours;
int wage;
}emp[10]; // 구조체 배열 변수 선언
int main(){
int i;
char temp[80];
for(i=0; i<19; i++){
printf("Enter name: ");
gets(emp[i].name);
printf("Enter phone number:");
gets(emp[i].phone);
printf("Enter hours worked");
gets(temp);
emp[i].hours = atoi(temp); //atoi: 문자열을 정수로 변환하는 함수
printf("Enter hourly wage:");
gets(temp);
emp[i].wage = atof(temp); // atof: 문자열을 실수로 변환하는 함수
printf("name=%s, phone=%s, hour=%d, wage=%d \n", emp[i].name, emp[i].phone, emp[i].hours, emp[i].wage);
}
}
[실습] 구조체 배열요소를 구조체 포인터를 사용하여 배열소요 역순으로 나타내는 프로그램
#include <stdio.h>
struct student{
char *name;
char *no;
int score;
};
int main(){
struct student *ptr, a[5] = {
{"Yoon, SY", "950102", 100},
{"Yoon, SY", "950103", 60},
{"Yoon, SY", "950200", 50},
{"Yoon, SY", "900000", 90},
{"Yoon, SY", "933330", 80}
};
int i;
ptr=a+4; // 배열의 다섯번째 요소
for(i=0; i<5; i++, ptr--) //구조체 포인터 1씩 감소시키면서 구조체 배열 요소 표시
printf("\n %12s %3s %6d", ptr->name, ptr->no, ptr->score);
}
/*
Yoon, SY 933330 80
Yoon, SY 900000 90
Yoon, SY 950200 50
Yoon, SY 950103 60
Yoon, SY 950102 100
*/
# 구조체 포인터
구조체 포인터를 사용하면 포인터를 통해 구조체 멤버에 접근할 수 있다.
- 구조체 변수 선언시 *붙여 포인터 선언
- 구조체 포인터는 포인터와 동일하게 주소값을 갖게 되며, 자료가 있는 곳을 가르킨다.
- 형식: struct 구조체명 *포인터변수명;
struct person{
char name[8];
int age;
char sex;
};
struct person man; //구조체 변수 man 선언
struct person *pt; // 구조체 포인터 변수 pt 선언
pt=&man; // 구조체 포인터 변수의 초기화
구조체 포인터를 선언하고, 구조체 변수의 주소를 할당한 후, 화살표 연산자(->)를 사용하여 멤버에 접근한다.
- 화살표 연산자와 도트 연산자의 차이
- 도트 연산자(.): 구조체 변수에 직접 접근할 때 사용된다.
- (*pt).name
- 화살표 연산자(->): 구조체 포인터를 통해 구조체 멤버에 접근할 때 사용된다.
- pt->name
- 도트 연산자(.): 구조체 변수에 직접 접근할 때 사용된다.
struct student *ptr;
ptr = &s1;
// 도트 연산자를 사용하여 구조체 멤버에 접근
printf("Using dot operator:\n");
printf("Name: %s\n", s1.name);
printf("Age: %d\n", s1.age);
printf("Score: %d\n", s1.score);
// 화살표 연산자를 사용하여 구조체 멤버에 접근
printf("Using arrow operator:\n");
printf("Name: %s\n", ptr->name);
printf("Age: %d\n", ptr->age);
printf("Score: %d\n", ptr->score);
# 함수와 구조체
- 구조체를 함수의 매개변수로 사용
- 해당 구조체 전체가 복사되기 때문에 편리
- but 구조체 전체가 복사되기 때문에 시간이 많이 걸리고, 기억 공간의 낭비가 심하다.
- 구조체 포인터를 함수의 매개변수로 사용
- 구조체를 복사하지 않기 때문에 실행속도가 향상되고, 기억공간의 사용효율도 좋다.
공용체(union)
동일한 기억장소에 여러 유형의 자료를 저장하기 위해서 프로그래머가 선언한 자료형
공용체 안에 포함된 자료들은 같은 기억장소를 공유
union이라는 예약어와 공용체명을 이용하여 정의
- 공용체 활용?
- 하드웨어 제어
- 도스 기능 호출
- 사용될 자료의 자료형이 유동적일 경우, 기억 공간을 효율적으로 사용할 수 있다.
- 필요에 따라 메모리의 자료형을 선택해서 값을 저장 가능
- 공용체가 사용되면 공용체의 멤버 중에서 자료크기(byte수)가 가장 큰 멤버에 대해서만 기억공간이 할당된다.
- 기억공간의 시작위치부터 각 부분을 다른 멤버가 공용으로 사용
#include <stdio.h>
union tag
{
int n;
float i;
} v1, *pt;
int main(){
float k;
pt = &v1;
v1.n =10;
v1.i = 20.0;
k=pt -> i;
printf("%f", k);
}
//결과
// 20.000000
union monetary {
int won; //공용체 멤버 선언
float dollar;
};
struct product {
char *name;
int ptype;
union monetary price; //구조체 멤버로 공용체를 가짐
};
반응형
'프로그래밍 > C 프로그래밍' 카테고리의 다른 글
[C언어] 메모리 동적 할당 (1) | 2024.06.06 |
---|---|
[C언어] 파일처리함수 (0) | 2024.06.06 |
[C언어] 포인터 및 참조 (0) | 2024.06.05 |
[C언어] 배열 (0) | 2024.06.04 |
[C언어] 함수 (0) | 2024.06.04 |