[C언어] 6. 구조체와 사용자 정의 자료형




제가 책(윤성우의 열혈 C 프로그래밍)을 보다가 까먹었던 부분만 포스팅 하는 것입니다!

순서가 뒤죽박죽이어도 이해해주세요~~!

구조체 변수의 초기화



구조체 멤버에 문자열이 있다고 하면,
초기화 과정에서는 문자열 저장을 위해서 strcpy함수를 호출하지 않아도 됩니다!



구조체 변수의 주소 값과 첫 번째 멤버의 주소 값



구조체 변수 이름의 주소 값은 구조체 변수의 첫 번째 멤버의 주소 값과 동일합니다.



typedef 선언



typedef 선언은 기존에 존재하는 자료형의 이름에
새 이름을 부여하는 것을 목적으로 하는 선언입니다.

typedef int INT; //int의 또 다른 이름 INT를 부여

typedef struct point
{
	int x;
	int y;
}Point; //구조체 자료형 struct point에 Point라는 이름을 부여!

typedef struct
{
	int x;
	int y;
}Point; //구조체의 이름도 생략가능합니다~



보통 typedef로 정의되는 자료형의 이름은 대문자로 시작하는 것이 관례입니다~



함수로의 구조체 변수 전달과 반환



함수의 인자로 구조체 변수가 전달될 수 있으며, 

전달되는 구조체의 값은 매개변수에 통째로 복사가 됩니다~
(Call-by-value)

구조체의 멤버로 배열이 선언되어도 역시 복사가 진행됩니다~!

구조체를 Call-by-referenc  형태로 호출하고 싶다면,

구조체의 포인터 변수를 이용하여야 합니다!



구조체 변수를 대상으로 가능한 연산



//구조체 변수에 허용되는 가장 대표적인 연산은 대입연산입니다~

#include <stdio.h>

typedef struct
{
	  int x;
   int y;
}Point;

int main(void)
{
	Point pos1={1,2};
	Point pos2;
	
	pos1=pos2; //pos1의 멤버가 pos2의 멤버로 복사가 됩니다!
	
	return 0;
}	



공용체(Union Type)의 정의와 의미



공용체(union)의 선언은 다음과 같습니다.

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



공용체 변수가 선언되면, 공용체를 구성하는 멤버는 각각 할당되지 않고,

그 중 가장 큰 멤버의 변수만 하나 할당되어 이를 공유하게 됩니다~!

공용체의 유용함은 다양한 접근방식을 제공하는데 있습니다.

예를 들어, 어떤 수를 다양한 자료형으로 출력가능합니다.


#include

typedef union //Ubox를 선언
{
	int num;
	char ch[4];
}Ubox;

int main(void)
{
	Ubox ub;
	ub.num=1234123; //ub의 멤버 num에 1234123을 저장
	
	//num와 ch는 공유하고 있기에 다음과 같이, 
	//1234123의 상위 1바이트의 아스키코드 출력이 가능합니다.
	
	printf("%c",ub.ch[0]);
	
	return 0; 
}	



열거형(Enumerated Type)의 정의와 의미



열거형은 변수에 저장이 가능한 값들을 열거하여 정의가 가능합니다~

예를 들어 syllable이라는 변수에 1,2,3,4,5,6,7이 저장 가능하다고 한다면,

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



그러면 이러한 연산이 가능합니다~

int main(void)
{
	Syllabe tone;
	
	for(tone=Do; tone<=Ti, tone++)
		printf("%d",tone);

}

//다시 말해서 저장할 상수들을 의미있는 이름으로 정의하는 것이 가능합니다~