본문으로 바로가기

C언어 공부 정리5(구조체)

category C언어/C 2020. 11. 27. 11:46

구조체 (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