구조체 (Struct)
: 사용자 정의 데이터타입
: 기존 데이터 타입을 묶어서 새로운 타입을 생성
(배열처럼 메모리가 붙어있다.)
: 선처리부에 항상 먼저 등록해줘야 인식된다.
struct DataTypeName{}
#include<stdio.h>
struct score // 구조체 선언
{
char name[10];
int kor, eng, mat, total;
float avg;
};
int main()
{
// student라는 이름으로 struct score를 사용하겠다 선언
struct score student;
scanf("%s", &student.name[0]);
// 주소인지 값인지 확인하는 것은 뒤에 표기법을 보고 확인
// &student.name[0] 주소값으로 변환할 때는 전체에 &를 붙인다.
scanf("%d", &student.kor);
scanf("%d", &student.eng);
scanf("%d", &student.mat);
student.total = student.kor + student.eng + student.mat;
student.avg = student.total / 3.f;
printf("%s\t%d\t%d\t%d\t%d\t%f\n", student.name, student.kor, student.eng, student.mat, student.total, student.avg);
}
typedef
typedef struct score
{
}SCORE; // 별칭 지정
int main()
{
SCORE student; // 별칭으로 사용할 수 있음
}
애로우
#include<stdio.h>
typedef struct score
{
char name[10];
int kor, eng, mat, total;
float avg;
}SCORE;
int main()
{
SCORE student;
SCORE* p;
p = &student;
scanf("%s", p->name);
scanf("%d", &(p->kor));
scanf("%d", &(p->eng));
scanf("%d", &(p->mat));
p->total = p->kor + p->eng + p->mat;
p->avg = p->total / 3.f;
printf("%s\t", (*p).name);
printf("%d\t", (*p).kor);
printf("%d\t", (*p).eng);
printf("%d\t", (*p).mat);
printf("%d\t", (*p).total);
printf("%f\n", (*p).avg);
}
문자열 함수
#include<stdio.h>
#include<string.h>
void main()
{
int cmp;
char name[] = "Superman";
char name1[20]; //= { 's' , 'u', 'p', 'e', 'r' };
name1[0] = 's';
name1[1] = 'u';
name1[2] = 'p';
name1[3] = 'e';
name1[4] = 'r';
name1[5] = '\0'; // 선언한 이후에 초기화하면 null값이 자동으로 들어가지 않기 떄문에 직접 넣어줘야함
printf("name size = %d\t %d\n", sizeof(name), sizeof(name1)); // byte 단위로 알려줌(메모리의 크기)
printf("%s\t%s\n", name, name1);
printf("len = %d\n", strlen(name)); // 실제 문자열의 길이를 리턴(null문자를 뺀 길이)
printf("len = %d\n", strlen(name1));
//name1 = name; // error
strcpy(name1, name); // 문자열 복사함수 : null문자까지 카피해줌
// strcpy(붙일곳, 복사할곳); 주소값을 입력
printf("%s\t%s\n", name, name1);
// 문자열 비교함수
cmp = strcmp(name1, name); // 리턴타입 int
printf("%d\n", cmp); // cmp == 0 : 같다. cmp != 0 : 다르다.
strcpy(name1, "batman");
cmp = strcmp(name1, name);
printf("%d\n", cmp);
//문자열 결합 함수
strcat(name1, name);
printf("%s\t%s\n", name, name1);
// overflow 주의. overflow이지만 실행된다면 툴이 잡아준 것이므로 수정해야함
}
call by address
#include<stdio.h>
#include<string.h>
void input(int* p);
void disp(int* p);
void disp2(int p);
int main()
{
int a; // 지역변수
// 입력함수 호출
input(&a); // a의 주소를 보내줌
// 출력함수 호출
printf("main = %d\n", a);
disp(&a); // call by address
disp2(a); // call by value
printf("main = %d\n", a);
}
void input(int* p) // 포인터로 받아줌
{
printf("값 : ");
scanf("%d", p);
}
void disp(int* p)
{
printf("disp = %d\n", *p);
}
void disp2(int p)
{
p = 500;
printf("disp2 = %d\n", p);
}
const
#include<stdio.h>
#include<string.h>
int main()
{
const int MAX = 100;
//MAX = 200; // ERROR
const int* p; // 읽기 전용 포인터
int* const p; // 주소 변경 불가 포인터
const int* const p; // 주소 변경 불가 + 읽기 전용 포인터 (너무 제한적이기 때문에 많이 사용하진 않음)
}
반응형
'C언어 > C' 카테고리의 다른 글
C언어 공부 정리6(동적 메모리) (0) | 2020.11.30 |
---|---|
C언어 공부 정리4(다차원 포인터) (0) | 2020.11.26 |
C언어 공부정리3(포인터) (0) | 2020.11.25 |
C언어 공부정리2(배열의 주소값) (0) | 2020.11.24 |
C언어 공부 정리1 (0) | 2020.11.23 |