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
반응형