본문 바로가기

C언어/복습

[C언어]DAY18_ 구조체 배열, 구조체 포인터, 구조체 동적할당

구조체 배열

: 구조체는 사용자가 정의한 타입. (char같은 타입을 내가 만들었다는 의미)



 

#include <stdio.h>
#define SIZE 3
#define MAX 100

//구조체 typedef A B : A를 B로 부른다.
typedef struct s_Student {
	//멤버
	int id;
	char subject[MAX];
} Student;


int main(){
	int i = 0;
	//구조체 배열을 선언과 초기화
	Student student[SIZE] = { {1111, "art"}, {2222, "math"}, {3333, "biology"} };

	printf("%d\n", sizeof(student[i].subject));
	//입력 : scanf
	for( i = 0; i<SIZE; i++){
		printf("id를 입력하세요 \n");
		scanf("%d", &student[i].id);
		printf("과목을 입력하세요 \n");
		scanf_s("%s", student[i].subject, sizeof(student[i].subject));
	}
	
	//출력
	for (i = 0; i < SIZE; i++){
		printf("%d   %s\n", student[i].id, student[i].subject );
	}
}

 

구조체 포인터

 

구조체 포인터를 사용하여 구조체의 멤버에 접근하는 방법

     : 화살표 연산자를 사용. -> student.id = p_stdent->id

          (  *참조연산자를 사용할 수도 있다. (*p_student).id  )

 

 


 

#include <stdio.h>
#include <string.h>

#define SIZE 3
#define MAX 100

typedef struct s_Student{
	int id;
	char major[MAX];
} Student ; //별칭

void print_struct(Student student){
	printf("%d  %s\n", student.id, student.major);


}

//Student* p_student = &student;
void print_struct2(Student* p_student){
	printf("%d  %s\n", p_student->id, p_student->major);

}

void change_struct2(Student* p_student){
	p_student->id = 2000;
	strcpy(p_student->major, "art");
}

int main(){
	int num = 0;
	int* p_num = &num;

	Student student = {1000, "biology"}; //student는 주소가 아니다. 변수이다. 값을 저장.
	Student* p_student = &student;

	print_struct(student);
	print_struct2(&student);
	
	change_struct2(&student); //2000, "art"를 대입
	print_struct(student);

	printf("%d  %s\n", (*p_student).id, (*p_student).major);
	//printf("%d %s\n", p_student->id, p_student->major);
	//printf("%d %s\n", student.id, student.major);
	//print_struct(student);

}

 


구조체 동적 할당

 


 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 100

//구조체 선언
typedef struct s_Student{
	int id;
	char major[MAX];
} Student;


int main(){
	//정적 선언
	Student student = {100, "art"}; 	

	//동적 할당
	//1. 포인터 선언
	Student* p_student = 0;

	//2. 메모리 할당
	p_student = (Student*)malloc(sizeof(Student));

	//테스트 코드 (입력 받기 전, 확인과정)
	p_student->id=100;
	strcpy(p_student->major, "chemistry");
	printf("%d %s\n", p_student->id, p_student->major);


	//사용자로부터 입력
	printf("id를 입력하세요\n");
	scanf("%d", &p_student->id);
	printf("전공을 입력하세요\n");
	scanf("%s", p_student->major);


	//출력
	printf("%d %s\n", p_student->id, p_student->major);


	//3. 메모리 반환
	free(p_student);



}

구조체 동적배열

 


 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 100

//구조체 선언
typedef struct s_Student{
	int id;
	char major[MAX];
} Student;


int main(){

	//동적 할당
	int count = 2;
	int i =0;
	//1. 포인터 선언
	Student* p_student[2] = {0, };

	//2. 메모리 할당
	for(i =0; i<count; i++){
		p_student[i] = (Student*)malloc(sizeof(Student));
	}


	//테스트 코드 (입력 받기 전, 확인과정)
	p_student[0]->id=100;
	strcpy(p_student[0]->major, "chemistry");
	p_student[1]->id=200;
	strcpy(p_student[1]->major, "econmics");


	printf("");

	////사용자로부터 입력
	//printf("id를 입력하세요\n");
	//scanf("%d", &p_student->id);
	//printf("전공을 입력하세요\n");
	//scanf("%s", p_student->major);


	//출력
	for(i=0; i<count; i++){
	printf("%d %s\n", p_student[i]->id, p_student[i]->major);
	}

	//3. 메모리 반환
	for(i=0; i<count; i++){
	free(p_student[i]);
	}

}

 


 

//구조체를 동적으로 할당 = 배열을 정적으로 할당한 것과 동일하게 사용할 수 있다.

//인덱스를 사용할 수 있다는 뜻.

//배열이란 물리적으로 변수가 연속적으로 할당되어 있는 것.

 


 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 100

//구조체 선언
typedef struct s_Student{
	int id;
	char major[MAX];
} Student;


int main(){

	//동적 할당
	int count = 2;
	int i =0;
	//1. 포인터 선언
	Student* p_student = 0;

	//2. 메모리 할당
	p_student = (Student*)malloc(sizeof(Student)*count);


	//사용자로부터 입력
	for(i=0; i<count; i++){
		//printf("id를 입력하세요\n");
		//scanf("%d", &(p_student+i)->id);
		//printf("전공을 입력하세요\n");
		//scanf("%s", (p_student+i)->major);

		printf("id를 입력하세요\n");
		scanf("%d", &p_student[i].id);
		printf("전공을 입력하세요\n");
		scanf("%s", p_student[i].major);

	}
	
	//테스트 코드 (입력 받기 전, 확인과정)
	//p_student->id=100;
	//strcpy(p_student->major, "chemistry");
	//p_student->id=200;
	//strcpy(p_student->major, "econmics");


	//출력

	//printf("%d  %s\n", (*p_student).id, (*p_student).major);
	//printf("%d %s\n", p_student->id, p_student->major);
	//printf("%d %s\n", student.id, student.major);

	for(i=0; i<count; i++){
		printf("%d %s\n", (p_student+i)->id, (p_student+i)->major);
		printf("%d %s\n", (*(p_student+i)).id, (*(p_student+i)).major);
		printf("%d %s\n", p_student[i].id, p_student[i].major);
	}

	//3. 메모리 반환
	free(p_student);


}