***********틀린 예제**********
typedef struct node *ptr;
typedef struct node{
ptr lchild;
int data;
ptr rchild;
} tree;
****************************
typedef는 새로운 형을 만드는 것이다.
아래와 같이 하는 경우는 변수일 뿐입니다.
ptr lchild;
int data;
ptr rchild;
}tree; //변수
node라는 이름의 구조체로 tree라는 변수가 만들어진것이다.
이때는 tree에 대해 tree[10] 등으로 배열형태로 만들수 있다 .
(예1)
struct node{
ptr lchild;
int data;
ptr rchild;
}tree[10];
그러나,
typedef struct node <<----typedef가 있음
{
...
}tree;
이렇게 하시면 tree는 위와 같은 구조체의 데이터형이 된다.
즉, tree가 int, double, float와 같은 것과 비슷한 부류가 되는 것이다.
여기서 tree는 데이터형이지 변수가 아니므로
당연히 tree[10]등이 될 수 없다.
int[10] 이렇게 안되는 것과 같다.
(예2)
typedef struct node{
ptr lchild;
int data;
ptr rchild;
}tree;
tree imsi[10]; //tree는 데이터형 이는 int imsi[10];처럼 된것이다. 고로 정상.
마지막으로 구조체위에
typedef struct node *ptr;
이런 식으로 되어있는데 이는 위에 typedef를 사용하지 않은 구조체가 정의되어있는 상태에서 해당 구조체 아래에 정의되어야 한다.
결론은 다음과 같이 선언할 수 있다.
(예3)
struct node1
{
...
};
typedef struct node1 *ptr;
typedef struct node
{
ptr lchild;
int data;
ptr rchild;
}tree;
tree imsi[10];
++++++++++++++++++++++++++++++++
typedef은 무엇이든지 새로운 형태의 형을 만드는 도구이다.
형이 되었으므로 형을 형처럼 잘 사용해야 한다.
----------------------------------------------------------------
typedef - 형재정의 , 함수 포인터의 리턴에서 typedef
----------------------------------------------------------------
unsigned short int 와 같은 긴 이름의 변수명으로 코딩을 할경우
오타로 인한 오류가 생길수가 있다.
이럴경우 typedef로 별칭을 짓는다.
------------------------------------
typedef unsigned short int USI;
void main()
{
USI k;
k=8;
}
-------------------------------------
typedef int (*parray)[3][4];
parray p; //int (*p)[3][4]와 동일.
---------------------------------------
함수 포인터의 리턴
함수 포인터를 리턴해랴 하는경우 함수 포인터의형태를 그대로 사용할수 없으며,typedef문에 의해 재정의 한 후 사용해야 한다.
copy() 함수의 함수 포인터를 리턴해야한다면
typedef char* (*pfunc)(char *s1,const char* s2, int len);
pfunc get_func(void)
{
return (pfunc)copy; //copy 함수 포인터를 리턴
}
pfunc pcopy; //함수 포이터 pcopy를 선언
pcopy =get_func; //함수 포인터 pcopy를 사용
pcopy(....); //copy()함수 호출...