본문 바로가기
c언어

c언어(구조체와 배열)_2024-05-17

by 앵보몬 2024. 5. 17.
728x90
반응형
#include <stdio.h>
#include <string.h>

struct Person
{
    char name[20];
    int age;
    char address[100];
};

int main(){

    struct Person p1;
    strcpy(p1.name, "앵보");
    p1.age = 28;
    strcpy(p1.address, "광주광역시 광산구 월계동");

    printf("이름 : %s\n", p1.name);
    printf("나이 : %d\n", p1.age);
    printf("주소 : %s\n", p1.address);

    return 0;
}
이름 : 앵보
나이 : 28
주소 : 광주광역시 광산구 월계동

 

#include <stdio.h>

struct Monitor
{
    char brand[20];
    int size;
    int resoution;
    char color[20];
};

int main(){

    struct Monitor m1 = {"LG", 27, 2560, "blue"};
    {
        printf("모니터 정보\n");
        printf("브랜드 : %s\n", m1.brand);
        printf("모니터 크기 : %d\n", m1.size);
        printf("모니터 해상도 : %d * 1440p\n", m1.resoution);
        printf("모니터 색상 : %s\n", m1.color);
    };
   
printf("\n=============\n");
struct Monitor m2 = {"samsung", 32, 3840, "black"};
    {
        printf("모니터 정보\n");
        printf("브랜드 : %s\n", m2.brand);
        printf("모니터 크기 : %d\n", m2.size);
        printf("모니터 해상도 : %d * 1440p\n", m2.resoution);
        printf("모니터 색상 : %s\n", m2.color);
    };

    return 0;
}
모니터 정보
브랜드 : LG
모니터 크기 : 27
모니터 해상도 : 2560 * 1440p
모니터 색상 : blue
=============
모니터 정보
브랜드 : samsung
모니터 크기 : 32
모니터 해상도 : 3840 * 1440p
모니터 색상 : black

 

#include <stdio.h>

struct Person{
   
    char name[20];
    int age;
};

int main(){

    struct Person p[3];
     
    for (int i = 0; i < 3; i++)
    {
        printf("%d 번째 이름을 입력하세요 : ", i+1);
        scanf("%s", p[i].name);
        printf("%d 번째 나이를 입력하세요 : ", i+1);      
        scanf("%d", &p[i].age);
   
    }  

    printf("\n  출력 부분입니다.  \n\n");
    for (int i = 0; i < 3; i++)
    {
        printf("Person %d : 이름 : %s 나이 : %d\n", i+1, p[i].name, p[i].age);
    }

    return 0;
}
1 번째 이름을 입력하세요 : 앵보
1 번째 나이를 입력하세요 : 28
2 번째 이름을 입력하세요 : 오랑우탄
2 번째 나이를 입력하세요 : 55
3 번째 이름을 입력하세요 : 침팬치
3 번째 나이를 입력하세요 : 60 

출력 부분입니다.

Person 1 : 이름 : 앵보  나이 : 28
Person 2 : 이름 : 오랑우탄  나이 : 55
Person 3 : 이름 : 침팬치  나이 : 60

 

#include <stdio.h>

enum DayOfWeek{    
    Sunday = 0,        
    Monday,
    Tuesday,
    Wednesday,
    Thursday,
    Friday,
    Saturday
};

int main(){
   
    enum DayOfWeek week;

    week = Friday;

    if (week == Friday)
    {
        printf("오늘은 불금입니다.");
    }
    else
    {
        printf("아쉽지만 금요일이 아니네요");
    }

    return 0;
}
오늘은 불금입니다.

 

 

#include <stdio.h>

enum numbers{    
    one = 1,        
    two,
    three
   
};

int main(){
   
    enum numbers mynumber;


    printf("숫자를 입력하세요 (1=one, 2=two, 3=three) : ");
    scanf("%d", &mynumber);

    switch (mynumber)
    {
        case one:
            printf("하나 입니다.\n");
            break;
        case two:
            printf("둘 입니다.\n");
            break;
        case three:
            printf("셋 입니다.\n");
            break;
        default:
            printf("없는 값을 입력했습니다.\n");
            break;
    }
   
    return 0;
}
숫자를 입력하세요 (1=one, 2=two, 3=three) : 2
둘 입니다.

 

 

구조체 멤버 정렬

C 언어는 CPU에서 메모리에 접근하는 효율을 높이기 위해 구조체를 일정한 크기로 정렬을 합니다. 이때 멤버 중에서 큰 자료형 크기의 배수로 정렬하며 남는 공간을 채우는 것을 패딩이라 부릅니다.

// 1 + 4 = 5 바이트 크기의 구조체
struct PacketHeader {
    char flags;    // 1바이트
    int offset;    // 4바이트
};

printf("%d\n", sizeof(struct PacketHeader)); // 8: 가장 큰 자료형은 int. int의 크기 4바이트로 정렬
                                             // 남는 3바이트는 패딩

구조체의 정렬 크기를 조절하려면 컴파일러에서 제공하는 지시자를 사용해야 합니다.

Visual Studio, GCC 4.0 이상
#pragma pack(push, 정렬크기)
#pragma pack(pop)

GCC 4.0 미만
__attribute__((aligned(정렬크기),packed))
 

구조체의 내용을 0으로 설정하기

구조체의 내용을 모두 0으로 설정하려면 memset 함수를 사용합니다.

memset(구조체포인터, 0, sizeof(struct 구조체));

 

구조체의 내용을 복사하기

구조체의 내용을 복사하려면 memcpy 함수를 사용합니다.

memcpy(목적지포인터, 원본포인터, sizeof(struct 구조체));

 

구조체 배열

구조체 변수를 선언하려면 [ ] (대괄호)에 크기를 지정합니다. 구조체 배열의 멤버에 접근하려면 [ ]에 인덱스를 지정한 뒤 .으로 접근합니다.

// 구조체 배열 선언하기
struct 구조체이름 변수이름[크기];

// 구조체 배열을 선언하는 동시에 값을 초기화
struct 구조체이름 변수이름[크기] = { { .멤버이름1 = 값1, .멤버이름2 = 값2 }, 
                                   { .멤버이름1 = 값3, .멤버이름2 = 값4 } };
struct 구조체이름 변수이름[크기] = { { 값1, 값2 }, { 값3, 값4 } };

배열[인덱스].멤버;         // 구조체 배열에서 요소의 멤버 값을 가져옴
배열[인덱스].멤버 = 값;    // 구조체 배열에서 요소의 멤버에 값을 저장

 

구조체 포인터 배열

구조체 포인터 배열을 선언하려면 포인터 변수 이름 뒤에 [ ]를 붙인 뒤 크기를 지정합니다. 이때 배열의 요소에는 메모리를 할당해야 하며 멤버에 접근할 때는 [ ]에 인덱스를 지정한 뒤 ->로 접근합니다.

// 구조체 포인터 배열 선언하기
struct 구조체이름 *포인터이름[크기];

// 구조체 포인터 배열에 메모리 할당하기
for (int i = 0; i < 크기; i++)                   // 배열 크기만큼 반복
{
    배열[i] = malloc(sizeof(struct 구조체));    // 각 요소에 구조체 크기만큼 메모리 할당
}

배열[인덱스]->멤버;          // 구조체 포인터 배열에서 요소의 멤버 값을 가져옴
배열[인덱스]->멤버 = 값;     // 구조체 포인터 배열에서 요소의 멤버에 값을 저장

// 구조체 포인터 배열의 메모리 해제하기
for (int i = 0; i < 크기; i++)    // 배열 크기만큼 반복
{
    free(포인터[i]);              // 각 요소의 동적 메모리 해제
}

https://dojang.io/mod/page/view.php?id=774

728x90
반응형

'c언어' 카테고리의 다른 글

c언어(구조체)_2024-05-21  (0) 2024.05.22
c언어(함수 포인터)_2024-05-20  (0) 2024.05.20
c언어(포인터와 배열)_2024-05-16  (0) 2024.05.16
c언어(switch 조건문)_2024-05-14  (0) 2024.05.14
c언어(if 조건문)_2024-05-13  (0) 2024.05.13