- 구조체
서로 다른 타입의 변수들을 묶어 사용 가능하게 한다.
아래와 같이 구조체 정의를 할 수 있다.
EX) struct student {
int number;
double score;
};
- 구조체 변수 선언
구조체 정의와 구조체 변수 선언은 다르다.
struct student { //구조체 정의
int number;
char name[10];
double grade;
};
int main(void){
struct student s1={123,"홍길동",123}; //구조체 변수 선언 및 초기화
}
+추가로 구조체 변수를 배열로 선언할 수도 있다.
struct student list[100];
- 구조체의 멤버 참조
위의 소스코드의 s1의 구조체 변수를 참조하였을 때,
s1.number = 456; 이나 s1.name="test"와 같이
"."을 통해서 구조체 멤버에 접근할 수 있다.
참고로 s1, s2, s3와 같이 구조체 변수를 여러 개 생성할 수도 있다.
- 구조체를 멤버로 가지는 구조체
구조체 속 구조체를 의미한다.
struct date { // 구조체 선언
int year;
int month;
int day;
};
struct student { // 구조체 선언
int number;
char name[10];
struct date dob; // 구조체 안에 구조체 포함
double grade;
};
int main(void){
struct student s1;
}
위 코드와 같이 student 구조체의 멤버를 살펴보면
dob 변수는 date 구조체 변수임을 확인할 수 있다.
이 경우에는 s1.dob.year=2023;와 같이
"."을 2번 사용하여 멤버에 접근할 수 있다.
추가로 구조체를 정의하는 위치에 따라서
전역, 지역 범위가 달라진다.
main() 내부에서 정의하면 지역, 외부에서 정의하면 전역이다.
- 구조체 변수의 대입과 비교
같은 구조체 변수끼리 대입은 가능하지만 비교는 불가능하다.
struct point {
int x;
int y;
};
int main(void)
{
struct point p1 = {10, 30};
struct point p2 = {30, 50};
}
여기서 p2=p1; 같이 대입은 가능하지만,
if(p1==p2)는 불가능하다.
if(p1.x==p2.x)와 같이 멤버를 참조하여서 값을 비교해야 한다.
- 구조체와 포인터
struct student {
int number;
char name[20];
double grade;
};
int main(void){
struct student s = { 24, “Kim”, 4.3 };
struct student *p;
}
원래는 p.number와 같이 멤버를 참조하였지만,
포인터로 구조체 변수가 선언된 경우
*p.number로 멤버를 참조하게 된다.
이를 c에서는 ->를 사용하여 표현할 수도 있다.
즉 *p.number = p->number와 같은 표현이다.
참고로 ->연산자가 *연산자보다 우선순위가 높다.
- 포인터를 멤버로 가지는 구조체
struct date {
int month;
int day;
int year;
};
struct student {
int number;
char name[20];
double grade;
struct date *dob;
};
int main(void){
struct student s1;
}
이렇게 값이 있다면 s1.*dob.month를 사용하여 구조체 멤버에 접근한다.
이를 ->로 표현하면 s1.dob->month와 같이 표현할 수 있다.
- 구조체와 함수
구조체를 함수의 인수로 전달하는 경우
구조체를 복사하기 위해 시간과 메모리가 소요된다.
그래서 구조체의 포인터를 함수의 인수로 전달하여 절약할 수 있다.
'대학교 > C언어' 카테고리의 다른 글
C언어 - (9) 포인터 (0) | 2023.05.25 |
---|---|
C언어 - (8) 배열, 정렬 (3) | 2023.05.18 |
C언어 - (7) 함수와 변수 (3) | 2023.05.04 |
C언어 - (6) 함수 (2) | 2023.05.04 |
C언어 - (5) 반복문 (3) | 2023.04.14 |