티스토리 뷰

728x90
SMALL

typeof 선언 : 기존에 존재하는 자료형의 이름에 새 이름을 부여하는 것을 목적으로 하는 선언

typeof 선언에 있어서 새로운 이름의 부여는 가장 마지막에 등장하는 단어, 구별 위해 앞에 대문자로 표시

typeof int INT, typeof unsigned int UINT, typeof struct point POINT

#include <stdio.h>

struct point
{
	int xpos;
	int ypos;
};

typedef struct point Point;

typedef struct person
{
	char name[20];
	char phoneNum[20];
	int age;
} Person;  //person을 생략해도 돼. 단, struct person man;은 불가능(어차피 안해)

int main(void)
{
	Point pos = { 10, 20 };
	Person man = { "이승기", "010-1212-0001", 21 };
	printf("%d %d \n", pos.xpos, pos.ypos);
	printf("%s %s %d \n", man.name, man.phoneNum, man.age);
	return 0;
}

call by reference

#include <stdio.h>

typedef struct point
{
	int xpos;
	int ypos;
} Point;

void OrgSymTrans(Point* ptr)
{
	ptr->xpos = (ptr->xpos) * -1;
	ptr->ypos = (ptr->ypos) * -1;
}

void ShowPosition(Point pos)
{
	printf("[%d, %d] \n", pos.xpos, pos.ypos);
}

int main(void)
{
	Point pos = { 7, -5 };
	OrgSymTrans(&pos);
	ShowPosition(pos);
	OrgSymTrans(&pos);
	ShowPosition(pos);
	return 0;
}

 변수를 대상으로는 매우 제한된 형태의 연산만 허용.(대입연산, &연산, sizeof연산)

#include <stdio.h>

typedef struct point
{
	int xpos;
	int ypos;
} Point;

typedef struct circle
{
	Point cen;
	double rad;
} Circle;

void ShowCircleInfo(Circle* cptr)
{
	printf("[%d, %d] \n", (cptr->cen).xpos, (cptr->cen).ypos);
	printf("radius: %g \n\n", cptr->rad);
}

int main(void)
{
	Circle c1 = { {1}, 3.5 };
	Circle c2 = { 2, 4, 3.9 };
	ShowCircleInfo(&c1);
	ShowCircleInfo(&c2);
	return 0;
}

 

구조체 vs 공용체 struct, union

typedef struct sbox    // 구조체 sbox의 정의
{
	int mem1;
	int mem2;
	double mem3;
} SBox;

typedef union ubox    // 공용체 ubox의 정의
{
	int mem1;
	int mem2;
	double mem3;
} UBox;

ex) int형 정수 입력받고

상위 2바이트와 하위 2바이트 값을 양의 값으로출력

상위 1바이트와 하위 1바이트에 저장된 값의 아스키 문자 출력

#include <stdio.h>

typedef struct dbshort
{
	unsigned short upper;
	unsigned short lower;
} DBShort;

typedef union rdbuf
{
	int iBuf;
	char bBuf[4];
	DBShort sBuf;
} RDBuf;

int main(void)
{
	RDBuf buf;
	printf("정수 입력: ");
	scanf_s("%d", &(buf.iBuf));

	printf("상위 2바이트: %u \n", buf.sBuf.upper);
	printf("하위 2바이트: %u \n", buf.sBuf.lower);
	printf("상위 1바이트 아스키 코드: %c \n", buf.bBuf[0]);
	printf("하위 1바이트 아스키 코드: %c \n", buf.bBuf[3]);
	return 0;
}

열거형 : 저장이 가능한 값 자체를 정수의 형태로 결정한다.

#include <stdio.h>

typedef enum syllable
{
	Do = 1, Re = 2, Mi = 3, Fa = 4, So = 5, La = 6, Ti = 7
} Syllable;

void Sound(Syllable sy)
{
	switch (sy)
	{
	case Do:
		puts("도는 하얀 도라지 ♪"); return;
	case Re:
		puts("레는 둥근 레코드 ♩"); return;
	case Mi:
		puts("미는 파란 미나리 ♩♪"); return;
	case Fa:
		puts("파는 예쁜 파랑새 ♪♭"); return;
	case So:
		puts("솔은 작은 솔방울 ♩♪♪"); return;
	case La:
		puts("라는 라디오고요~ ♪♩♭♩"); return;
	case Ti:
		puts("시는 졸졸 시냇물 ♩♭♩♪"); return;
	}
	puts("다 함께 부르세~ 도레미파 솔라시도 솔 도~ 짠~");
}

int main(void)
{
	Syllable tone;
	for (tone = Do; tone <= Ti; tone += 1)
		Sound(tone);
	return 0;
}

상수의 값을 선언하지 않으면 0부터 1씩 증가, 중간에 비어있으면 전꺼+1

열거형의 유용함은 둘 이상의 연관이 있는 이름을 상수로 선언함으로써 프로그램의 가독성을 높이는데 있다.

 

728x90
LIST

' > 윤성우 열혈 C 프로그래밍' 카테고리의 다른 글

파일 입출력2  (0) 2020.09.24
파일 입출력1  (0) 2020.09.23
구조체와 사용자 정의 자료형1  (0) 2020.09.20
문자와 문자열 관련 함수  (0) 2020.09.19
c언어 난수생성  (0) 2020.09.19
댓글
공지사항