본문 바로가기

programming language/C 언어

열혈 ( C ) chapter 23 정리노트 1

 

typedef 선언

 

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

 

#include<stdio.h>

typedef int INT;
typedef int* PTR_INT;

typedef unsigned int UINT;
typedef unsigned int* PTR_UINT;

typedef unsigned char UCHAR;
typedef unsigned char* PTR_UCHAR;

int main(void)
{
	INT num1 = 120;
	PTR_INT pnum1 = &num1;

	UINT num2 = 190;
	PTR_UINT pnum2 = &num2;

	UCHAR ch = 'z';
	PTR_UCHAR pch = &ch;

	printf("%d, %u, %c \n", *pnum1, *pnum2, *pch);
	return 0;
}

 

typedef int INT;  int의 또 다른 이름 INT를 부여한 문장이다.(자료형의 이름 int에 INT라는 이름을 추가로 붙여준 것이다.)

그러므로 int num;INT num; 은 동일한 선언이다. 또 int * ptr;INT * ptr; 은 동일한 선언이다.

 

typedef unsigned int* PTR_UINT;  unsigned int*의 포인터형에 PTR_UINT의 이름이 새롭게 부여되었다.

 

PTR_UINT pnum2 = &num2; 의 문장은 unsigned int * pnum2 = &num2; 와 동일하다.

 

typedef  선언에 있어 새로운 이름의 부여는 가장 마지막에 등장하는 단어를 중심으로 이루어진다고 한다.

예를 들면 typedef name1 name2 name3; 의 형태로 선언이 되었다면, 가장 마지막에 등장한 name3가 'name1 name2'에 부여된 새로운 이름이 되는 것이다.

 

참고로, typedef로 정의되는 자료형의 이름은 대문자로 시작하는 것이 관례라고 한다.

Ex) typedef unsigned char* PTR_UCHAR;

 

구조체의 정의와 typedef선언

 

<예시>

 

#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;

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

 

typedef struct point Point ; struct point에 Point라는 이름을 부여한 것이다.

 

즉, stucrt point를 대신할 수 있도록, Point를 정의했으니 , struct 선언을 생략한 형태로 구조체 변수를 선언할 수 있다.

 Point pos; (typedef 선언을 이용한 변수의 선언)

 

만약, typedef 선언을 이용하지 않은 채로 구조체 변수를 선언한다면, struct point pos;와 같이 struct 선언을 추가한 형태의 변수 선언을 해주어야 한다.

 

<구조체 이름 생략>

 

typedef struct
{
	char name[20];
	char phoneNum[20];
	int age;
}Person;

 

위 예시에서 typedef선언을 이용해 Person이라는 이름을 새롭게 부여했었는데, 이렇게 새롭게 이름이 부여가 되면 그전 구조체의 이름 person은 사실상 별 의미를 갖지 않으므로 위와 같이 구조체 이름을 생략하는 것이 가능하다.