구조체의 형태

struct 구조체 이름 { 구조체 멤버들 };
-----------------
   자료형 부분

 

 

구조체의 예시

struct student
{
	char name[15];
	int s_id;
	int age;
	char phone_number[14];
};

int main()
{
	**struct student goorm**;
		
	printf("이름 : %s, 학번 : %d, 나이 : %d, 번호 : %s\\n", goorm.name, goorm.s_id, goorm.age, goorm.phone_number);
	
	return 0;
}

 

 

구조체 초기화

.변수명 = 00

#include <stdio.h>

struct student
{
	int age;
	char phone_number[14];
	int s_id;
};

int main()
{
	struct student goorm = { **.age = 20**, **.phone_number = "010-1234-5678"**, 10 };

	printf("나이 : %d, 번호 : %s, 학번 : %d\\n", goorm.age, goorm.phone_number, goorm.s_id);

	return 0;
}

 

 

typedef를 이용한 구조체 선언

  • typedef : C언어에서 자료형을 새롭게 이름 붙일 때 쓰는 키워드
  • 구조체를 정의할 때 중괄호 뒤에 별칭을 써주면 됨
#include <stdio.h>

typedef struct _Student {
	int age;
	char phone_number[14];
} **Student;**

int main(){
	**Student goorm;       // struct student gorrm 이라고 할 필요 없이 별칭만 씀**
	
	printf("나이 : ");
	scanf("%d", &goorm.age);
	printf("번호 : ");
	scanf("%s", goorm.phone_number);
	
	printf("----\\n나이 : %d\\n번호 : %s\\n----", goorm.age, goorm.phone_number);
	
	return 0;
}

 

 

익명 구조체

#include <stdio.h>

typedef struct {      **// 구조체 이름을 적지 않고 별칭만 사용**
	int age;
	char phone_number[14];
} Student;

int main(){
	**Student goorm;**
	
	printf("나이 : ");
	scanf("%d", &goorm.age);
	printf("번호 : ");
	scanf("%s", goorm.phone_number);
	
	printf("----\\n나이 : %d\\n번호 : %s\\n----", goorm.age, goorm.phone_number);
	
	return 0;
}

 

 

구조체 배열

#include <stdio.h>

typedef struct {
	char name[30];
	int age;
} Student;

int main(){
	Student goorm[3] = { {.name = "해리 포터"}, {.name = "헤르미온느 그레인저"}, {.name = "론 위즐리"} };
**// 문자열은 선언할 때만 초기화할 수 있으므로, 문자열은 선언과 동시에 초기화 필요**
	
	goorm[0].age = 10;
	goorm[1].age = 10;
	goorm[2].age = 10;
	
	printf("이름 : %s / 나이 : %d\\n", goorm[0].name, goorm[0].age);
	printf("이름 : %s / 나이 : %d\\n", goorm[1].name, goorm[1].age);
	printf("이름 : %s / 나이 : %d\\n", goorm[2].name, goorm[2].age);
	
	return 0;
}

 

 

구조체 포인터

  • 구조체를 가리키는 포인터
  • 포인터를 사용할 때 *ptr.age 라고 하는 게 아니라, (*ptr).age 와 같이 괄호 사용 필요 (온점도 연산자이기 때문)
  • ptr -> 변수 이렇게 써도 됨!
#include <stdio.h>

typedef struct {
	int s_id;
	int age;
} Student;

int main(){
	Student goorm;
	**Student *ptr;**    **// 구조체를 가리키는 포인터**
	
	ptr = &goorm;
	
	**(*ptr).age = 20;**
	**ptr->age = 20;      // 이런 기호를 쓸 수도 있음**
	
	**printf("goorm의 나이: %d\\n",  goorm.age);
}

 

 

중첩 구조체

  • 상위구조체 안의 하위구조체를 사용하고 싶으면 상위구조체.하위구조체.변수 와 같이 연속으로 멤버를 참조해야 함
    • 담임 선생님의 정보를 학생 정보마다 넣고 싶을 경우, 학생 구조체 안에 선생님 구조체를 넣으면 편함
#include <stdio.h>

typedef struct {
	char name[15];
	int age;
} Teacher;

typedef struct {
	char name[15];
	int age;
	**Teacher teacher;** 
} Student;

int main(){
	Student Student;
	Teacher Teacher;
	
	**Student.teacher.age** = 30;
	Teacher.age = 40;
	
	return 0;
}

 

 

자기 참조 구조체

  • 자기 자신을 가리키는 포인터를 멤버로 가짐
  • 나중에... 연결 리스트나 트리를 만들 때 쓰임 (자료구조)
typedef struct {
	char name[15];
	int age;
	**struct Student *ptr;** 
} Student;

 

 

구조체 전달

  • 구조체는 값을 바꿀 필요가 없는 경우에도, 매개변수로 구조체를 전달할 때에는 포인터를 사용 (공간 세이브를 위해)
#include <stdio.h>

typedef struct {
	int s_id;
	int age;
} Student;

void print_student(Student *s){
	s->s_id = 2000;
	s->age = 25;
	
	printf("학번 : %d, 나이 : %d\\n", s->s_id, s->age);
}

int main(){
	Student s;

	s.s_id = 1000;
	s.age = 20;
	
	print_student(&s);
    
	printf("학번 : %d, 나이: %d\\n", s.s_id, s.age);
}

+ Recent posts