구조체
사용자가 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 |