본문 바로가기
C언어

C언어_구조체

by 히예네 2023. 1. 24.
728x90
반응형

1. 구조체(struct) - 클래스와 객체를 만듬

서로 연관 있는 변수를 묶어서 관리하는 문법, 새롭게 나만의 자료형을 만듬

서로 다른 자료형(이름,성적,평균 등) 을 묶어서 새로운 자료형을 만들자

 

배열은 같은 자료형만 저장한다. 새로운게 필요해! 학생별로 박스를 만들자!

구조체 안쓰면 변수 40개를 만들어야함…기본에는 한 변수에 하나만 저장함.

name - char*
kor - int
eng- int
ave - double

 

구조체의 특징

  • 파스칼 표기법만! Student 시작의 첫글자는 대문자
  • Student s; 스튜던트 자료형이라 하면됨
  • 각각은 구조체의 멤버변수라고 한다
  • 다른데서는 쓸 수 없다 .
  • 자료형은 여러개 만들 수 있다.
  • 구조체도 배열로 만들 수 있다.

💡 구조체는 변수가 아니다. 새로운 자료형을 만든 것임.

자료형 6개 있다고 해서 변수 6개가 있는게 아니다.

변수는 메모리에 만들어진 것

반복문은 힘듬 struct는 반복문으로 생성 불가

 

배열과 차이점

배열 구조체
같은 자료형을 묶음 연관된 변수를 묶음
Ex) int는 in형끼리 Ex) XX의 국영수 성적(int),평균(lf) 등

<구조체의 기본구조>

#include <stdio.h>

//이름, 국어, 영어, 평균데이터를 한번에 저장할 수 있는
//새로운 자료형 설계

struct Student //아직 자료형만 설계한 것임
{
	char* name; //변수 선언문과 비슷
	int kor;   //변수가 아니다!!!!!!!!!!!!!! 새로운 자료형 형태임. 그러므로 초기화 불가능
	int eng;
	double aver;
};

//이름,나이를 저장하는 또다른 새로운 자료형

//[국적,도시]를 저장하는 새로운 자료형 설계
struct Address //대문자로 쓰는것은 구조체라는 암묵적 룰
{
	//주소[국적,도시]를 추가해보자
	char* nation;
	char* city;
};

struct Person  //여기까지는 새로운 자료형을 만든것임
{
	char* name; //다른영역이므로 변수명이 중복되도 된다.
	int age;
	//멤버변수 가져오자
	struct Address address; //멤버변수 3개 어드레스안에는 멤버변수2개이다
};

void output(struct Student s); // 스트럭다음줄에 쓰는게 더 좋다 

void main()
{

	struct Student stu; // struct는 자료형이 아니다. 스트럭트는 구조체를 불러온다 
	                    //명령/자료형/변수 이름
	stu.name = "sam"; // .연산자로 멤버변수를 불러온다. "sam"이 아니라 "sam"을 가르키는 주소가 나옴
	stu.kor = 80;
	stu.eng = 70;
	stu.aver = (double)(stu.kor+stu.eng)/2; //형변환

	printf("이름 : %s\\n", stu.name);
	printf("국어 : %d\\n", stu.kor);
	printf("영어 : %d\\n", stu.eng);
	printf("평균 : %lf\\n", stu.aver);

	printf("\\n");

	struct Student stu2 = {"robin",90,95,92.5};
	output(stu2);

	struct Student stu3 = {"Hong",40,50,45.0}; //구조체의 초기화. 배열과 비슷하다
	output(stu3);

	//person 자료형의 구조체 변수 
	struct Person a;
	a.name = "park";
	a.age = 20;
	a.address.nation = "korea";
	a.address.city = "seoul";

	printf("name : %s    age : %d   address : %s,%s\\n", a.name, a.age, a.address.nation, a.address.city);

	struct Person b;
	b.name = "kim";
	b.age = 25;
	b.address.nation = "usa";
	b.address.city = "newyork";

	printf("name : %s    age : %d   address : %s,%s\\n", b.name, b.age, b.address.nation, b.address.city);
	
	printf("\\n");
	//구조체로 만든 자료형도 배열로 변수들을 한번에 만들수있다.
	struct Person people[3];
	people[0].name = "sam";
	people[0].age = 20;

	people[1].name = "robin";
	people[1].age = 25;

	people[2].name = "hong";
	people[2].age = 30;

	for (int i = 0; i < 3; i++)
	{
		printf(" %s - %d \\n", people[i].name, people[i].age);
	}

}

//구조체 변수의 값을 출력하는 기능 함수

void output(struct Student s) //자료형은???
{
	printf("이름 : %s\\n", s.name);
	printf("국어 : %d\\n", s.kor);
	printf("영어 : %d\\n", s.eng);
	printf("평균 : %lf\\n", s.aver);
	printf("\\n");
}
#include <stdio.h>

//이름과 나이를 한번에 저장하는 자료형 설계. 변수가 아니다. 초기화 불가능
struct Person
{
char* name;
int age;
};

void main()
{
int a = 10;
int* p = &a;

printf(" a:%d \\n", *p); //
*p 그 주소를 불러와라

struct Person person;
[person.name](<http://person.name/>) = "sam";
person.age = 20;

struct Person* 
pp=&person;
printf("name : %s \\n", (*pp).name); //. 연산자가 *보다 우선시 된다.
printf("age : %d \\n", (*pp).age); //. 연산자가 *보다 우선시 된다.

(*pp).age = 25; //pp가 가르키는 곳을 25로 바꾼다
printf("변경된 age : %d \\n", (*pp).age);

(*pp).name = "robin";
pp->age = 20; //포인터의 대입방법 화살표를 만든다.
printf("변경된 age : %d \\n", pp->age);

}

구조체를 Heap영역에 만들기

malloc(sizeof(struct Person)); 

자바가 선호하는 형태

#include <stdio.h>
#include <stdlib.h> //heap영역에 만드

//이름과 나이를 한번에 저장하는 자료형 설계. 변수가 아니다. 초기화 불가능
struct Person
{
char* name;
int age;
};

//printf("%d",sizeof(struct Person)); 사이즈 알려주는 명령
//비어있는 멤버들 사이즈를 채운다 4,8,4 니까 16이다? 아니다 24다 4/4/8/4

void main()
{
struct Person* p=malloc(sizeof(struct Person)); 
//포인터변수는 8바이트, 바이트수는 명령으로 부르는게 정확하다
//p는 포인터변수 stack에 저장됨
p->name = "sam";
p->age = 20;
printf("name : %s \\n", p->name);
printf("age : %d \\n", p->age);

struct Person* p2;//포인터변수 만든것임
p2 = p;//sam과 20을 가르키는 주소를 넣은것임 값을 넣는게아니다

p2->age = 30;

printf("name : %s \\n", p->name);
printf("age : %d \\n", p->age);   //포인터변수 2개를 쓴다? 공유가 된다! 주소를 복사한것이므로 바뀐다!
}
728x90
반응형

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

C언어_포인터  (0) 2023.01.24
C언어_배열  (0) 2023.01.24
C언어_함수  (0) 2023.01.23
C언어_제어문  (0) 2023.01.23
C언어_연산자  (0) 2023.01.23