구조체 배열
: 구조체는 사용자가 정의한 타입. (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 = #
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);
}
'C언어 > 복습' 카테고리의 다른 글
[C언어]DAY19_구조체와 리스트, 열거형 상수, 구조체와 함수의 인수 (0) | 2020.02.12 |
---|---|
[C언어]DAY17_동적 메모리 할당(문자열이 여러개인 경우), 구조체 선언 (0) | 2020.02.10 |
[C언어]DAY16_동적 할당, 동적 배열 (0) | 2020.02.10 |
[C언어]DAY15_ 포인터 배열, 더블포인터, 문자열 표준 라이브러리 (0) | 2020.02.10 |
[C언어]DAY14_배열포인터 (0) | 2020.02.05 |