본문 바로가기
프로그래밍 언어/C

C언어 - 11. 구조체와 공용체

by nomfang 2021. 3. 21.
728x90
반응형

1. 구조체의 개념

구조체(strucure)란?

  • 서로 다른 자료형을 갖는 자료들을 하나의 자료형으로 정의하여 사용하는 자료형
    : 사용자 정의 자료형
  • 다양한 형식의 자료를 간결하게 표현 가능

약간의 객체 지향적 성격을 갖는 자료형 같음
함수의 명사 버전 같기도 하다

2. 구조체의 정의와 변수 선언

구조체의 정의

  • 형식 :
  • struct 구조체명{ 구조체 멤버 변수 1; 구조체 멤버 변수 2; };

구조체 변수 선언

  • 형식: struct 구조체명 변수명1, 변수명2, 변수명3;
  • 사용예 : struct score x, y[10], *z;

3가지의 방법 중 원하는 형태를 선택해서 사용하면 됨

구조체 정의와 변수 선언
// 형식 1
struct socre{
    char name[8],
    int math
}; struct score X;

//형식 2
struct socre{
    char name[8],
    int math
} X;

//형식 3 (typedef를 통해 구조체 이름으로 새로운 자료형을 정의할 수 있음)
typedef struct socre{
    char name[8],
    int math
} math;       
math X;

3. 구조체 변수의 초기화 및 참조

struct person{
    char name\[8];
    int age;
};
struct person X = {"부평초", 20};

구조체 멤버의 참조

  • 형식 : 구조체변수명.멤버변수명;
  • printf("person X의 age는 %d", X.age);

구조체의 기억공간 구조

  • 구조체의 기억공간 할당은 가장 큰 자료형의 크기로 할당된다
    • 8 byte 문자열, 4 byte int, 1 byte char를 사용하여 구조체를 만들면
      char자료형은 가장 큰 자료형인 4byte로 할당되어 총 16byte로 생성됨

4. 구조체의 배열

구조체의 배열

  • 동일한 구조를 갖는 구조체 변수가 여러개 사용될 때
    구조체 변수들을 대표하는 배열명으로 일반 변수와 같이 사용 가능하다
구조체 배열의 예
struct persom{
    char name\[8];
    int age;
}; 
struct person X[3];
구조체 배열의 기억공간 표현

  • 2차원 배열과 같은 모습
    -> 행렬이나 데이터 프레임의 형태를 떠올리면 될듯
구조체 배열의 초기화
struct person X[3] =
{{"이름1", 20}.
{"이름2", 30},
{"이름", 32}};
구조체 배열의 멤버 참조
register i;

for (i=0; i<3; i++){

    printf("X의 %d번째 person의 이름은 %s", i, X[i].name);
}


strcpy(X[1].name, "네임2"); // 구조체 배열 X의 두 번째 name에 네임2 저장(덮어쓰기)
X[0].age = 22; // 구조체 배열 X의 첫 번째 나이를 22로 

5. 구조체 포인터

구조체 포인터

  • 구조체를 보다 쉽게 다룰 수 있다
  • 구조체변수 선언시 *을 붙여 포인터로 선언
  • 구조체포인터는 구조체의 주소값읋 가지고 있음
구조체 포인터의 선언
  • 형식 : struct 구조체명 *변수명;

    struct person {
      char name[8];
      int age;
    };
    struct person man;
    struct person \*man_pointer;
    // man_pointer == &man;
구조체 포인터의 멤버 참조
  • 도트 연산자( . ) 이용
    : (*man_pointer).name;
  • 포인터 연산자 ( -> )를 이용
    : man_pointer -> name
기억공간 표현

#include <stdio.h>

// main() 함수 밖에 구조체 정의 

struct student {
    char name[10];
    int math;
};

void main(){

    //구조체 초기화
    struct student st[4] = 
        {{"kim", 90},
         {"lee", 95},
        {"park", 80}};

    struct student *p;  // 구조체 포인터 선언
    p = st; // 구조체 포인터 변수에 구조체 시작 주소를 대입

    printf("name = %s, score = %d, p -> name, p -> math); // kim, 90 출력
    p += 1    
        // i=0, st[i] 일 때 i + 1 을 해주는 것과 같은 의미

    printf("name = %s, score = %d, p -> name, p -> math);
    // lee, 95 가 출력된다
반응형

댓글