데이터 타입이 다른 데이터들을 다루기 위해 C언어의 기본 타입을 가지고 사용자가 새롭게 지정할 수 있는 사용자 정의 타입
배열은 같은 데이터 타입 (int, char, float 등)만을 묶어서 데이터를 저장할 수 있다.
하지만 학생의 이름, 키, 나이 등을 저장하는 경우와 같이 서로 다른 데이터 타입을 처리하고 싶을 때
구조체를 이용해 사용자가 데이터 값을 다룰 수 있다.
이때, 구조체 내에서 다루는 데이터를 필드 라고 이야기하고 { } 안에 필드를 선언해야한다.
그리고 각각의 데이터들은 멤버변수 라고 표현한다.
구조체는 구조체 변수를 선언해서 이용할 수 있다.
struct student{ //struct (구조체이름)
int age; // 필드 선언
char name[10]; // 변수 선언과 동일하게 (멤버변수의 타입) (멤버변수의 이름) 으로 선언
float height;
};
struct student mystudent; //구조체 변수 선언해서 구조체를 이용할 수 있다.
자바의 class 가 구조체에서 발전된 개념이다.
typedef struct 구조체이름 구조체의 새로운이름;
typedef struct student{
int age;
char name[10];
float height;
...
}stu;
// 구조체의 정의와 typedef 선언을 동시에 할 수 있다.
-> main 문에서 struct student (변수이름) 으로 구조체 선언하던걸
stu (변수이름) 으로 간편하게 사용할 수 있다.
student.age
student = {.age=10, .name="basamg", height = 180.5, ...};
// 나머지 멤버 변수는 0으로 초기화 된다.
구조체의 주소와 구조체의 첫 번째 멤버의 주소는 같다.
#include <stdio.h>
typedef struct student{
int age;
char name[5];
float height;
}school;
int main(){
school stu1 = {.age=10, .name="basam", .height=180.5};
school stu2 = {.age=20, .name="amy", .height=160.5};
printf("학생1 %d %s %.1f\n",stu1.age, stu1.name, stu1.height);
printf("학생2 %d %s %.1f",stu2.age, stu2.name, stu2.height);
}
#include <iostream>
using namespace std;
typedef struct temp{
int TEMP;
}t;
int main(){
t* ex = new t[10];
t* test1 = new t;
test1->TEMP=0;
ex[0] = *test1;
delete test1;
t* test2 = new t;
test2->TEMP=3;
ex[1] = *test2;
delete test2;
t* test3 = new t;
test3->TEMP=5;
ex[2] = *test3;
delete test3;
cout<<ex[2].TEMP;
}
선언한 구조체 타입의 포인터 변수를 생성하고
선언한 구조체 타입의 자료형을 저장할 수 있는 배열을 new 함수로 메모리 동적할당을 해준다.
배열의 원소로 넣을 새로운 포인터 변수를 설정해주고 메모리 할당 후 구조체 내부 멤버 변수를 설정 후
새로운 포인터 변수를 배열에 넣어준다.
-> 그럼 배열 안에 할당된 메모리 공간을 저장하고 참조할 수 있게 된다.