1. char*(포인터 변수)는 대입연산자(=)를 쓸 수 있고 scanf_s()는 불가능하다
2. char[](포인터 상수)는 대입연산자(=)를 쓸 수 없고 scanf_s()는 가능하다
3. 구조체(변수의 집합)
1) 타입이다.
2) 묶음이다.
4. 구조체 선언
1) struct 태그명 { //회사에서는 주로 구조체명이라고 안부르고 태그명이라고 부름
멤버변수명;
...
};
2) typedef struct 태그명 {
멤버변수명;
...
} 타입으로 사용할 태그명;
5. 구조체 사용
1) struct 구조체명 변수명 = { 초기값, ... };
struct 구조체명 변수명 = NULL;
구조체명.멤버변수명 = 값;
2) 태그명 변수명 = { 초기값, ... }
6. 구조체와 배열
: 배열은 같은 자료형의 값만 다룰 수 있으나.
구조체는 다른 자료형의 값도 다룰 수 있다.
7. 구조체와 클래스
: 구조체는 변수들만 선언할 수 있지만 클래스는 함수도 선언 가능하다.
클래스는 C++, Java, Python에서 다룬다
8. 구조체 목적
: 공통요소들을 한 군데에 묶에서 쉽게 관리하기 위해 사용한다.
같은 자료형이라면 배열로 선언할 수 있지만,
인덱스로 접근하는 배열은 각 방의 의미를 전달하기에 어려움이 있다.
하지만 구조체는 각 방마다 이름이 있기 때문에 가독성이 좋다.
9. 오늘 실습코드
1) graph2.c
#include<stdio.h>
#include<stdlib.h>
#include<Windows.h>
void main() {
//학생 수를 입력받고 그 만큼 동적할당
//학생별 점수 입력
//ㅂ한자를 누르면 x축과 y축을 이어서 그릴 수 있다.
//│★
//│★ ★
//└──────
char** arName = 0;
int* arScore = 0;
int cnt = 0;
char temp[30] = "";
printf("학생 수 : ");
scanf_s("%d", &cnt);
arScore = (int*)malloc(sizeof(int) * cnt);
arName = (char**)malloc(sizeof(char*) * cnt);
for (int i = 0; i < cnt; i++) {
arName[i] = (char*)malloc(sizeof(char) * 30);
printf("이름 : ");
scanf_s("%s", temp, sizeof(temp));
for (int j = 0; j < 30; j++) {
arName[i][j] = temp[j];
}
printf("%s 학생 점수 : ", arName[i]);
scanf_s("%d", arScore + i);
}
system("cls");
for (int i = 10; i > 0; i--) {
printf("%3d │", i * 10);
for (int j = 0; j < cnt; j++) {
if (arScore[j] >= i * 10) {
if (arScore[j] == i * 10) {
//뚜껑
printf(" ┌───┐ ");
}
else {
//막대
printf(" │ │ ");
}
}
else {
//공백
printf(" ");
}
Sleep(200);
}
printf("\n");
}
printf("%3d └─", 0);
for (int i = 0; i < cnt; i++) {
if (arScore[i] == 0) {
printf("───────");
}
else {
printf("┴───┴──");
}
Sleep(200);
}
printf("\n ");
for (int i = 0; i < cnt; i++) {
printf(" %s ", arName[i]);
Sleep(200);
}
printf("\n");
for (int i = 0; i < cnt; i++) {
free(arName[i]);
}
free(arName);
free(arScore);
}
2) strDarr.c
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void main() {
char** arName = 0;
char temp[30] = "";
int cnt = 0;
printf("명수 : ");
scanf_s("%d", &cnt);
arName = (char**)malloc(sizeof(char*) * cnt);
for (int i = 0; i < cnt; i++) {
arName[i] = (char*)malloc(sizeof(char) * 30);
printf("이름 : ");
scanf_s("%s", temp, sizeof(temp));
for (int j = 0; j < 30; j++) {
arName[i][j] = temp[j];
}
}
for (int i = 0; i < cnt; i++) {
printf("%s\n", arName[i]);
}
}
3) structTest.c
#include<stdio.h>
#include<string.h>
//유휴메모리를 없애기 위해서 1byte씩 증가하도록 하는 명령어
#pragma pack(push, 1)
void main() {
//구조체 안에 있는 멤버변수 중 byte수가 가장 큰 것으로
//용량이 증가한다. 따라서 42byte만 할당하면 되는 것을
//8byte용량으로 늘어나기 때문에 총 크기는 48byte가 된다.
//6byte가 바로 유휴메모리이다.
//struct tag_Animal {
// char name[30];
// int age;
// double weight;
//};
typedef struct Animal {
char name[30];
int age;
double weight;
}tag_Animal;
//struct tag_Animal dog = {"찰리", 3, 2.76};
tag_Animal dog = {"찰리", 3, 2.76};
printf("%d\n", sizeof(dog));
strcpy_s(dog.name, sizeof(dog.name), "찰스");
printf("%s\n", dog.name);
printf("%d살\n", dog.age);
}
4) structTest2.c
#include<stdio.h>
#pragma pack(push, 1)
typedef struct Car {
char brand[30];
int price;
char color[30];
}tag_Car;
void main() {
//너무 답답하다..!! 같은 타입이니깐...!!! 배열로 선언하자!!
//tag_Car monCar = {"Benz", 9000, "Black"};
//tag_Car dadyCar = { "BMW", 8000, "Blue" };
//tag_Car myCar = { "Bentley", 35000, "white" };
//짜잔...!! 배열로 한번에 묶어버렸오...!!!
tag_Car cars[] = { { "Benz", 9000, "Black" },{ "BMW", 8000, "Blue" },{ "Bentley", 35000, "White" } };
printf("%d\n", sizeof(tag_Car));
printf("%d\n", sizeof(cars[0]));
printf("%d\n", sizeof(cars));
printf("length : %d\n", sizeof(cars) / sizeof(tag_Car));
}
'웹_프론트_백엔드 > 단과' 카테고리의 다른 글
[단과_자료구조] 2020.07.13 (0) | 2020.07.14 |
---|---|
[단과_C] 2020.03.24 (0) | 2020.03.25 |
[단과_C] 2020.03.20 (0) | 2020.03.22 |
[단과_C] 2020.03.19 (0) | 2020.03.20 |
[단과_C] 2020.03.18 (0) | 2020.03.18 |