대학교/C언어

C언어 - (10) 구조체

매 석 2023. 6. 2. 18:16
반응형

- 구조체

서로 다른 타입의 변수들을 묶어 사용 가능하게 한다.

아래와 같이 구조체 정의를 할 수 있다.

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