without haste but without rest

[C] 구조체 본문

ProgrammingLanguage/C

[C] 구조체

JinungKim 2020. 2. 27. 14:41
Reference - C언어 코딩도장

1. 구조체 기본 형태

 

C 언어는 클래스가 없다. 이 역할을 구조체가 하는 듯 하다.

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

 


2. 구조체 예제

 

1). 멤버를 직접 정의하기

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>

struct Person {
    char name[20];          // 구조체 멤버1
    int age;                // 구조체 멤버2
    char address[100];      // 구조체 멤버3
};			// 구조체 정의 뒤에 변수를 붙이면 선언까지 한번에 할 수 있다.

int main()
{
    struct Person p1;       // 구조체 변수 선언

    strcpy(p1.name, "홍길동");
    p1.age = 30;
    strcpy(p1.address, "대한민국");

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

    return 0;
}

 

 

 

2). 구조체 변수 선언과 동시에 값을 초기화 하기

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>

struct Person {
    char name[20];          // 구조체 멤버1
    int age;                // 구조체 멤버2
    char address[100];      // 구조체 멤버3
};

int main()
{
    struct Person p1 = { .name = "홍길동", .age = 30, .address = "서울" };

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

    return 0;
}

 

 

 

3-1). tpyedef로 struct 키워드 생략하고 구조체 선언하기

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>

typedef struct _Person {
    char name[20];          // 구조체 멤버1
    int age;                // 구조체 멤버2
    char address[100];      // 구조체 멤버3
} Person;

int main()
{   // struct 키워드 없이 선언 가능
    Person p1 = { .name = "홍길동", .age = 30, .address = "서울" };

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

    return 0;
}

 

 

 

3-2). 별칭을 사용하지 않는 경우 

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>

typedef struct _Person {
    char name[20];          // 구조체 멤버1
    int age;                // 구조체 멤버2
    char address[100];      // 구조체 멤버3
};

int main()
{
    struct _Person p1 = { .name = "홍길동", .age = 30, .address = "서울" };

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

    return 0;
}

 

 

 

(4). 익명 구조체

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>

typedef struct {	    // * 구조체 이름을 생략할 수 도 있다. -> 별칭으로 선언한다.
    char name[20];          // 구조체 멤버1
    int age;                // 구조체 멤버2
    char address[100];      // 구조체 멤버3
} Person;

int main()
{
    Person p1 = { .name = "홍길동", .age = 30, .address = "서울" };

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

    return 0;
}

 

 


3. 구조체 포인터

 

1). 기본 예제

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

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

int main()
{
    struct Person* p1 = malloc(sizeof(struct Person));

    strcpy(p1->name, "홍길동");
    p1->age = 30;
    strcpy(p1->address, "서울");

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

    free(p1);

    return 0;
}

* 구조체 포인터의 멤버에 값을 할당하고 호출하는 경우 . 대신 -> 을 사용한다. 

* -> 화살표 연산자 (Arrow Operator)

* 포인터는 메모리 주소를 저장하므로 어떤 값이 있는 곳을 가르킨다. 그래서 화살표 연산자를 사용한다.

* . 으로 접근하고자 하는 경우 (*p1).age 형태로 접근할 수 있다.

 

 

 

 

2). 구조체 포인터에 동적 메모리 할당하기

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

typedef struct Data {
    char c1;
    int* numPtr;
};

int main()
{
    int num = 10;
    struct Data d1; //구조체 변수
    struct Data* d2 = malloc(sizeof(struct Data));  //구조체 포인터에 메모리 할당

    d1.numPtr = &num;
    d2->numPtr = &num;

    printf("%d\n", *d1.numPtr);     // 구조체의 멤버를 역참조
    printf("%d\n", *d2->numPtr);    // 구조체 포인터의 멤버를 역참조

    d2->c1 = 'a';
    printf("%c\n", (*d2).c1);       // 구조체 포인터를 역참조하여 c1에 접근
    printf("%d\n", *(*d2).numPtr);  // 구조체 포인터를 역참조하여 numPtr에 접근하고 다시 역참조
                                    // *d2->numPtr 과 같음

    free(d2);

    return 0;
}

* 별칭과 익명 구조체도 사용할 수 있다. 

 

 

 

3). 구조체 포인터에 구조체 변수의 주소 할당하기

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

typedef struct Data {
    int age;
};

int main()
{
    struct Data d1;
    struct Data* ptr;

    ptr = &d1;

    ptr->age = 30;

    printf("%d\n", d1.age);
    printf("%d\n", ptr->age);

    return 0;
}

 


 

'ProgrammingLanguage > C' 카테고리의 다른 글

[C] 열거형  (0) 2020.02.29
[C] 공용체  (0) 2020.02.29
[C] sprintf / 버퍼  (0) 2020.02.26
[C] 문자열 관련 함수  (0) 2020.02.26
[C] 포인터  (0) 2020.02.26
Comments