Skip to content

Instantly share code, notes, and snippets.

@Rockheung
Last active January 12, 2019 12:30
Show Gist options
  • Save Rockheung/e1daba808aec87ff58c440049049a036 to your computer and use it in GitHub Desktop.
Save Rockheung/e1daba808aec87ff58c440049049a036 to your computer and use it in GitHub Desktop.

Data Structure Chapter 2 - Structure

구조체

  • 배열과 비슷하지만 각 구성요소의 타입을 명시해야
/* 사용1 */
struct employee {
    char name[10];
    int year;
    int age;
};
struct employee Park = { "Park", 2018, 2600 };

/* 사용2 */
struct employee {
    char name[10];
    int year;
    int age;
} Park = { "Park", 2018, 2600 };

/* 사용3 */ 
struct {
    char name[10];
    int year;
    int age;
} Park = { "Park", 2018, 2600 };

/* typedef 를 이용한 일반적 형태 */
typedef struct _employee {
    char name[10];
    int year;
    int age;
} Employee;

Employee Park = { "Park", 2018, 2600 };
  • 2-12, 점 연산자를 이용해 데이터 항목 참조
#include <stdio.h>

struct employee {
    char name[10];
    int year;
    int pay;
};

int main() {

    struct employee Park[4] = {
        { "박흥준", 2018, 10000 },
        { "박형준", 2013, 10000 },
        { "박힁준", 2018, 10000 },
        { "박힇춘", 1918, 10000 },
    };

    int i;

    for (i=0; i<4; i++) {
        printf("%s \n", Park[i].name);
        printf("struct addr: %u\n", &Park[i]);
        printf("char addr: %u, val: %s\n", &Park[i].name, Park[i].name);
        printf("year addr: %u, val: %d \n", &Park[i].year, Park[i].year);
        printf("pay addr: %u, val: %d \n\n", &Park[i].pay, Park[i].pay);
    }

    return 0;
}
$ gcc 2-12.c -o 2-12.out && ./2-12.out
2-12.c: In function ‘main’:
2-12.c:22:31: warning: format ‘%u’ expects argument of type ‘unsigned int’, but argument 2 has type ‘struct employee *’ [-Wformat=]
         printf("struct addr: %u\n", &Park[i]);
                              ~^     ~~~~~~~~
2-12.c:23:29: warning: format ‘%u’ expects argument of type ‘unsigned int’, but argument 2 has type ‘char (*)[10]’ [-Wformat=]
         printf("char addr: %u, val: %s\n", &Park[i].name, Park[i].name);
                            ~^              ~~~~~~~~~~~~~
2-12.c:24:29: warning: format ‘%u’ expects argument of type ‘unsigned int’, but argument 2 has type ‘int *’ [-Wformat=]
         printf("year addr: %u, val: %d \n", &Park[i].year, Park[i].year);
                            ~^               ~~~~~~~~~~~~~
                            %ls
2-12.c:25:28: warning: format ‘%u’ expects argument of type ‘unsigned int’, but argument 2 has type ‘int *’ [-Wformat=]
         printf("pay addr: %u, val: %d \n\n", &Park[i].pay, Park[i].pay);
                           ~^                 ~~~~~~~~~~~~
                           %ls
박흥준 
struct addr: 2348284928
char addr: 2348284928, val: 박흥준
year addr: 2348284940, val: 2018 
pay addr: 2348284944, val: 10000 

박형준 
struct addr: 2348284948
char addr: 2348284948, val: 박형준
year addr: 2348284960, val: 2013 
pay addr: 2348284964, val: 10000 

박힁준 
struct addr: 2348284968
char addr: 2348284968, val: 박힁준
year addr: 2348284980, val: 2018 
pay addr: 2348284984, val: 10000 

박힇춘 
struct addr: 2348284988
char addr: 2348284988, val: 박힇춘
year addr: 2348285000, val: 1918 
pay addr: 2348285004, val: 10000
  • 2-13, 화살표 연산자를 이용해 데이터 항목 참조하기
#include <stdio.h>
#include <string.h>

struct employee {
    char name[10];
    int year;
    int pay;
};

int main() {

    struct employee Park, Rock;
    struct employee *Sptr = &Park;
    struct employee *Sptr2 = &Rock;
    strcpy(Sptr->name, "박흥준");
    Sptr->year = 2011;
    Sptr->pay = 10830;
/*
 *  Not working
 *  Sptr2->name = "락흥";
 *  (*Sptr2).name = "락흥";
 */
    strcpy((*Sptr2).name, "락흥");
    (*Sptr2).year = 2013;
    (*Sptr2).pay = 12830;

    int i;

    printf("%s \n", Park.name);
    printf("struct addr: %u\n", &Park);
    printf("char addr: %u, val: %s\n", &Park.name, Sptr->name);
    printf("year addr: %u, val: %d \n", &Park.year, Sptr->year);
    printf("pay addr: %u, val: %d \n\n", &Park.pay, Sptr->pay);

    printf("%s \n", Rock.name);
    printf("struct addr: %u\n", &Rock);
    printf("char addr: %u, val: %s\n", &Rock.name, Sptr2->name);
    printf("year addr: %u, val: %d \n", &Rock.year, Sptr2->year);
    printf("pay addr: %u, val: %d \n\n", &Rock.pay, Sptr2->pay);

    return 0;
}
$ gcc 2-13.c -o 2-13.out && ./2-13.out
2-13.c: In function ‘main’:
2-13.c:30:27: warning: format ‘%u’ expects argument of type ‘unsigned int’, but argument 2 has type ‘struct employee *’ [-Wformat=]
     printf("struct addr: %u\n", &Park);
                          ~^     ~~~~~
2-13.c:31:25: warning: format ‘%u’ expects argument of type ‘unsigned int’, but argument 2 has type ‘char (*)[10]’ [-Wformat=]
     printf("char addr: %u, val: %s\n", &Park.name, Sptr->name);
                        ~^              ~~~~~~~~~~
2-13.c:32:25: warning: format ‘%u’ expects argument of type ‘unsigned int’, but argument 2 has type ‘int *’ [-Wformat=]
     printf("year addr: %u, val: %d \n", &Park.year, Sptr->year);
                        ~^               ~~~~~~~~~~
                        %ls
2-13.c:33:24: warning: format ‘%u’ expects argument of type ‘unsigned int’, but argument 2 has type ‘int *’ [-Wformat=]
     printf("pay addr: %u, val: %d \n\n", &Park.pay, Sptr->pay);
                       ~^                 ~~~~~~~~~
                       %ls
2-13.c:36:27: warning: format ‘%u’ expects argument of type ‘unsigned int’, but argument 2 has type ‘struct employee *’ [-Wformat=]
     printf("struct addr: %u\n", &Rock);
                          ~^     ~~~~~
2-13.c:37:25: warning: format ‘%u’ expects argument of type ‘unsigned int’, but argument 2 has type ‘char (*)[10]’ [-Wformat=]
     printf("char addr: %u, val: %s\n", &Rock.name, Sptr2->name);
                        ~^              ~~~~~~~~~~
2-13.c:38:25: warning: format ‘%u’ expects argument of type ‘unsigned int’, but argument 2 has type ‘int *’ [-Wformat=]
     printf("year addr: %u, val: %d \n", &Rock.year, Sptr2->year);
                        ~^               ~~~~~~~~~~
                        %ls
2-13.c:39:24: warning: format ‘%u’ expects argument of type ‘unsigned int’, but argument 2 has type ‘int *’ [-Wformat=]
     printf("pay addr: %u, val: %d \n\n", &Rock.pay, Sptr2->pay);
                       ~^                 ~~~~~~~~~
                       %ls
박흥준 
struct addr: 1506390208
char addr: 1506390208, val: 박흥준
year addr: 1506390220, val: 2011 
pay addr: 1506390224, val: 10830 

락흥 
struct addr: 1506390240
char addr: 1506390240, val: 락흥
year addr: 1506390252, val: 2013 
pay addr: 1506390256, val: 12830
  • 구조체 연산은 내부 데이터끼리, 같은 구조체끼리의 Rock = Park 와 같은 구문은 복사가 이루어짐, 주소는 구조체 &이름을 포인터변수에 할당.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment