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

[C] 구조체 (structure)

by 까망 하르방 2021. 3. 19.
반응형

구조체(structure)는 연관 있는 데이터를 하나로 묶을 수 있는 자료형으로

데이터의 표현 및 관리가 용이해진다.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

struct point {
    int x, y;
};

int main(void) {
    struct point pos;
    scanf("%d %d", &pos.x, &pos.y);
    printf("%d %d", pos.x, pos.y);
}

 

구조체 변수의 선언과 초기화

구조체를 정의함과 동시에 변수를 선언할 수 있으며,

선언과 동시에 구조체 멤버에 값을 할당할 수도 있다.

※ 초기화하지 않은 일부 멤버는 Default 값으로 초기화

#include <stdio.h>
struct point {
    int x, y;
}pos, pos2;

int main(void) {
    struct point pos3 = {10, 20};
}

 

구조체 배열

#include <stdio.h>

struct point {
    int x, y;
};

int main(void) {
    struct point pos[2] = { {1, 1}, {2, 2} };
    for (int i = 0; i < 2; i++) {
        printf("%d %d \n", pos[i].x, pos[i].y);
    }
}

 

구조체 변수와 포인터

(*ptr).x = 10;형태보다 ptr->y = 20;를 주로 사용

#include <stdio.h>

struct point {
    int x, y;
};

int main(void) {
    struct point pos = {1, 2};

    struct point *ptr = &pos;
    (*ptr).x = 10;
    ptr->y = 20;

    printf("%d %d \n", pos.x, pos.y);    
}

 

 

참고

- 구조체 변수의 주소 값은 구조체 변수의 첫번째 멤버의 주소 값과 동일

- TYPE형 구조체 변수의 멤버로 TYPE형 포인터 변수를 둘 수 있다.

struct point {
    int x, y;
    struct point* ptr;
};

선언과 동시에 초기화, 이 경우에는 구조체가 전역변수로도 사용 가능.

 

typedef 선언

struct point {
    int x, y;    
};
typedef struct point Point;

Point p = {10, 20};

구조체 이름을 생략해서도 가능한데 그러한 경우,

struct point p;를 이용한 변수 선언은 할 수 없습니다.

typedef struct point { // typedef로 재정의하기 때문에 구조체 이름("point") 생략 가능
    int x, y;    
} Point;

Point p = {10, 20};

 

구조체 내에서 연산은 대입, & 연산, sizeof 정도의 연산만 허용된다.

즉, 구조체 변수를 대상으로 사칙연산도 되지 않기에 함수 정의를 통해 직접 구현해야 한다.

#include <stdio.h>

typedef struct {
    int x, y;
} Point;

Point addPoint(Point p1, Point p2) {
    Point p = { p1.x + p2.x, p1.y + p2.y };
    return p;
}

int main(void) {
    Point A = { 1, 1 };
    Point B = { 2, 3 };
    Point result = addPoint(A, B);
    printf("%d %d \n", result.x, result.y);
}

 

 

 

 

 

반응형

댓글