구조체

·2023년 3월 8일
0

C

목록 보기
6/13

📌구조체

struct 구조체이름{
	멤버들..
    char str[10];
    int i;
}; //마지막에 꼭 붙인다

서로 다른 형태를 묶어서 쓸수 있게 해준다.

선언

struct 구조체이름 변수명

타입은 struct 구조체이름이다

사용법

#include <stdio.h>
struct Human {
	int age;    
	int height; 
	int weight; 
};
int main() {
	struct Human Psi;

	Psi.age = 99;
	Psi.height = 185;
	Psi.weight = 80;

	printf("%d\n", Psi.age);
	printf("%d\n", Psi.height);
	printf("%d\n", Psi.weight);
	return 0;
}

구조체 포인터

struct test {
	int a, b;
};
int main() {
	struct test st;
	struct test* ptr;

	ptr = &st;

	(*ptr).a = 1;	//st.a와 동일
	(*ptr).b = 2;	//st.b와 동일

	printf("st 의 a 멤버 : %d \n", st.a);
	printf("st 의 b 멤버 : %d \n", st.b);

	return 0;
}

.이 *보다 우선순위 높아서 묶어줘야한다.

ptr->a = 1;	//st.a와 동일
ptr->b = 2;	//st.b와 동일

이러한 문제를 해결하기 위해서 ->로 표시한다.

struct Test {
	int c;
	int* pointer;
};
int main()
{
	struct Test t;
	struct Test* pt = &t;
	int i = 0;

	t.pointer = &i;

	*t.pointer = 3;

	printf("i : %d \n", i);

	*pt->pointer = 4;

	printf("i : %d\n", i);

	return 0;
	return 0;
}

우선순위가 .이 높아서 *(t.pointer) *(pt->pointer) 이렇게 동작한다

int add_one(int* a);
struct Test {
	int c;
};
int main()
{
	struct Test t;
	struct Test* pt = &t;

	pt->c = 0;

	add_one(&t.c);
	printf("%d\n", t.c);

	add_one(&pt->c);
	printf("%d\n", t.c);

	return 0;
}
int add_one(int* a)
{
	*a += 1;
	return 0;
}

📌구조체를 인자로 전달하기

#include <stdio.h>
struct TEST {
	int age;
	int gender;
};
int set_human(struct TEST a, int age, int gender);
int main() {
	struct TEST human;
	set_human(human, 10, 1);
	printf("AGE : %d // Gender : %d ", human.age, human.gender);
	return 0;
}
int set_human(struct TEST a, int age, int gender) {
	a.age = age;
	a.gender = gender;
	return 0;
}

틀린코드다 고쳐보자(아래정답)

#include <stdio.h>
struct TEST {
	int age;
	int gender;
};
int set_human(struct TEST *a, int age, int gender);
int main() {
	struct TEST human;
	set_human(&human, 10, 1);
	printf("AGE : %d // Gender : %d ", human.age, human.gender);
	return 0;
}
int set_human(struct TEST *a, int age, int gender) {
	a->age = age;
	a->gender = gender;
	return 0;
}

구조체도 다른 변수들과 마찬가지로 함수에 주소값을 넘겨줘야 값이 바뀐다.

#include <stdio.h>
struct TEST {
	int age;
	int gender;
	char name[20];
};
int set_human(struct TEST* a, int age, int gender, const char* name);
char copy_str(char* dest, const char* src);

int main() {
	struct TEST human;

	set_human(&human, 10, 1, "Lee");

	printf("AGE : %d // Gender : %d // Name : %s \n", human.age, human.gender,
		human.name);
	return 0;
}
int set_human(struct TEST* a, int age, int gender, const char* name) {
	a->age = age;
	a->gender = gender;
	copy_str(a->name, name);

	return 0;
}
char copy_str(char* dest, const char* src) {
	while (*src) {
		*dest = *src;
		src++;
		dest++;
	}

	*dest = '\0';

	return 1;
}

char이 어떻게 넘어가는지 살펴보기


📌구조체 안 구조체


struct employee {
	int age;
	int salary;
};
struct company {
	struct employee data;
	char name[10];
};
int main()
{
	struct company Kim;

	Kim.data.age = 31;
	Kim.data.salary = 3000000;

	printf("Kim's age : %d \n", Kim.data.age);
	printf("Kim's salary : %d $/year \n", Kim.data.salary);

	return 0;
}

구조체도 하나의 Type이라서 지극히 자연스러운 모습이다


📌구조체 변수의 정의 방법


struct obj {
	char name[20];
	int x, y;
}Ball;

struct obj Ball;과 같다

struct HUMAN {
	int age;
	int height;
	int weight;
	int gender;
};

int main()
{
	struct HUMAN Adam = { 31, 182, 75, 0 };
	struct HUMAN Eve = { 27, 166, 48, 1 };
	return 0;
}

초기화를 {}안에 넣어서 해주면 더 편하다

📌바이트패딩


프로그램 속도 향샹을 위해서 바이트패딩이라는 규칙을 사용한다.
컴파일러는 메모리의 접근을 쉽게 하기 위해 크기가 가장 큰 멤버 변수 기준으로 메모리 크기를 맞추게 된다(바이트 패딩)
이때 추가 되는 바이트를 패딩바이트라고 말한다.


📌Typedef


typedef (이름을 부여하고자 하는 타입) (새로 준 타입의 이름)

구조체에

struct HUMAN{}

struct HUMAN Human

or 
typedef struct HUMAN{}Human;

이렇게 사용하면 기존에 struct HUMAN h1 이렇게 지정해야 하지만
typedef을 사용하면 Human h1 이렇게 간단하게 만들어서 사용가능하다.


문제(문자열관련)


Problem2.c

참고자료

씹어먹는 C언어
TCPSchool
교육들을때 캡처한 것

profile
개인공부저장용(하루의 기록)

0개의 댓글