C언어

C언어 <구조체>

um_coding 2023. 8. 5. 13:13

구조체

사용자가 c언어의 기본 타입을 가지고 새롭게 정의할 수 있는 사용자 정의 타입

다양한 타입의 변수 집합을 하나의 타입으로 나타낸 것

 

구조체 정의 변수 선언을 동시에 하기

struct 구조체 이름{

멤버변수1의타입 멤버변수1의이름;

멤버변수2의타입 멤버변수2의이름;

...

}구조체변수이름;

 

ex)

struct book{

    char title[30];

    char author[3];

    int price;

}my_book;

구조체를 가리키는  포인터

구조체의 이름은 구조체를 가리키는 주소가 아니다.

따라서 포인터 할당할 때에는 반드시 주소 연산자(&a)를 사용해야 한다.

struct 구조체이름*구조체포인터이름;

ex) struct book*ptr_my_book;

 

구조체 포인터를 이용하여 구조체의 멤버에 접근하는 방법에는 다음과 같이 두가지 방법이 있다.

1. 참조 연산자(*)를 이용하는 방법

(*ptr_my_book).author

참조 연산자(*)는 멤버 연산자(.)보다 연산자 우선순위가 낮으므로 반드시 괄호(())를 사용해야 한다.

 

2.화살표 연산자(->)를 이용하는 방법

ptr_my_book -> author

 

struct Point2D{

    int x;

    int y;

};

2차원 평면에서 점 표시하기

피타고라스의 정리를 이용

a와 b의 길이 구하기

int a = p2.x-p1.x; //선 a의 길이

int b= p2.y-p1.y; //선 b의 길이

 

루트는 제곱근을 뜻하는 square root에서 따왔으며 math.h 헤더파일을 선언

sqrt(값)

double sqrt(double_X);

제곱근을 반환._x가 음수이면 NaN을 반환

이때 제곱근은 소수로 나오므로 double형 변수에 저장

 

pow(값, 지수)

double pow(double _X, double _Y);

_X의 _Y 거듭제곱을 반환

즉, a^2를 구하고 싶다면 pow(a,2)처럼 사용ㅇ

double c = sqrt(pow(a,2) + pow(b,2));

구조체 멤버 정렬

구조체는 서로 관련된 여러 개의 변수를 하나의 묶음으로 처리하는 데 사용

구조체 내의 멤버 변수들은 메모리에 연속적으로 배치되며, 이때 멤버 변수들의 정렬은 컴파일러에 따라 다를 수 있다.

이런 멤버 변수의 정렬은 구조체의 크기를 결정하며, 효율적인 메모리 사용과 성능을 고려하기 위해 중요

 

1. 구조체 멤버의 순서대로 정렬: 기본적으로 c언어에서는 구조체 멤버를 선언된 순서대로 메모리에 배치한다. 즉, 첫 번째 멤버가 가장 먼저 메모리에 위치하고, 두 번째 멤버는 첫 번째 멤버 뒤에 세 번째 멤버는 두 번째 멤버 뒤에 이어서 배치

 

2. 자동 정렬: 구조체 멤버의 크기와 컴파일러가 정한 정렬 규칙에 따라 멤버들을 메모리에 배치한다. 이러한 정렬방식은 특정 컴파일러마다 다를 수 있다.

 

3. 수동 정렬: 사용자가 직접 멤버의 크기와 메모리 정렬을 지정한다. 주로 프로그래머가 특정한 메모리 구조를 요구하는 경우에 사용된다.

 

구조체 배열

같은 반 학생의 번호와 몸무게, 키를 저장하는 구조체는 다음과 같이 정의할 수 있다.

struct class{

    int number;

    double weight;

    double height;

};

반 전체 학생이 10명이라 가정했을 때 하나 생성하면 힘들다.

이 문제를 해결하려면 구조체에 배열을 사용하면 된다. 구조체 배열을 선언하는 방법은 일반 자료형 배열을 선언하는 것과 같다.

int a[10]

 

    struct myclass a[10]; //구조체 배열 선언

 

{

    a[0].number = 23; //구조체 배열 첫 번째 요소의 멤버 변수 number초기화

    a[0].weight = 75.2; //구조체 배열 첫 번째 요소의 멤버 변수 weight초기화

    a[0].height = 180.3 //구조체 배열 첫 번째 요소의 멤버 변수 height초기화

    a[1].number = 27; //구조체 배열 두 번째 요소의 멤버 변수 number초기화

    ...

    a[9].number = 75; //구조체 배열 열 번째 요소의 멤버 변수 number초기화

};

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

C언어 <메크로 함수>  (0) 2023.08.05
C언어 <공용체>  (0) 2023.08.05
C언어 <가변인자>  (0) 2023.08.05
C언어 <전치행렬>  (0) 2023.08.05
C언어 <문자열> <함수 포인터>  (0) 2023.07.26