Chinaunix首页 | 论坛 | 博客
  • 博客访问: 510901
  • 博文数量: 81
  • 博客积分: 7010
  • 博客等级: 少将
  • 技术积分: 1500
  • 用 户 组: 普通用户
  • 注册时间: 2005-12-15 10:51
文章分类

全部博文(81)

文章存档

2011年(1)

2009年(22)

2008年(58)

我的朋友

分类: C/C++

2009-06-05 17:47:49

typedef为C语言的关键字,作用是为一种数据类型定义一个新名字。这里的数据类型包括内部数据类型(int,char等)和自定义的数据类型(struct等)。在编程中使用typedef目的一般有两个,一个是给变量一个易记且意义明确的新名字,另一个是简化一些比较复杂的类型声明。

typedef与结构结合使用:

定义struct结构体:struct 结构体名{
                                    包含的成员;
                                     ... } 变量名;
//这里的结构体名如果后面不用的话,可以省略;如果暂时不急定义变量来使用的话,那么这里的变量名也可以省略;其他的一个都不能少。
※注意:
结构体定义是不可以递归的

例如:struct time{
               int hour;
               int min;
              int sec;
              struct time next;
          };//非法的定义,编译报错。
但是我们可以这么解决:struct time{
                                       int hour,min,sec;
                                       struct time *next;
                                   };//合法的
定义结构体变量可以在刚才的结构体定义的后面定义,但是它毕竟是有局限的。一般是用:
struct 结构体名 变量名(指针名,数组名...);//初始化
例如:struct time bjtm;//bjtm代表北京时间
指针也可以定义为结构的类型,说白了就是指向这种结构的指针,所以有:struct time *tm;
那么我们怎么使用这个指针呢?
       先赋值:tm=&bjtm; 至此,tm可以使用这个bjtm了,并且可以修改它了。
注意在调用成员的时候格式为两种:
1:tm->min;//最常用的
2:(*tm).min;//很少用了

typedef定义的一般形式为:

typedef struct tagNode
{
 char *pItem;
 pNode pNext;
} *pNode;
//编译错误,因为:新结构建立的过程中遇到了pNext域的声明,类型是pNode,要知道pNode表示的是类型的新名字,那么在类型本身还没有建立完成的时候,这个类型的新名字也还不存在,也就是说这个时候编译器根本不认识pNode。

解决方法:

  1)、typedef struct tagNode {
                   char *pItem;
                   struct tagNode *pNext; } *pNode;

  2)、typedef struct tagNode *pNode;
              struct tagNode{
                  char *pItem;
                   pNode pNext; }; //此处用typedef给一个还未完全声明的类型起新名字。C语言编译器支持这种做法

        3)、规范做法:struct tagNode{
                                   char *pItem;
                                 struct tagNode *pNext;};
                              typedef struct tagNode *pNode;

typedef 原类型名   新类型名; //功能:将原类型名表示的数据类型用新类型名代表

例如:typedef int counter;   //int a; 与 counter a;二者定义的效果一样
例如:typedef char stringb[12]; // string text; 表明text为含12个字符的数组                                                       再例如:typedef char *stringptr; // stringptr buffer; 表明buffer为字符指针                                                       

另外:typedef struct stu
           { char name[20];
           int age;
             char sex;
          } STU;
定义STU表示stu的结构类型,然后可用STU(新类型名)来说明结构变量:

STU body1,body2; //定义了body1,body2 两个结构体变量,也相当于struct stu body1,body2;

EXAMPLE:                                                                                                                                          举例举例1:struct:   struct stu
                { int num;
                  char name[20];
                  char sex;  
                  int age;
                }s1={97001,"Lin Lin",'F',19};//在定义的时候就初始化s1;
举例2:typedef struct :typedef struct
                          { int num;
                            char name[20];
                            char sex;  
                             int age;}stu;
                          int main{
                                stu s1;//注意这里的写法
                                s1.age=18;
                                  ....}

举例3:用typedef,当遭遇定义结构体指针的时候
typedef struct stu//(1)
{ int num;
   char name[20];
   char sex;  
   int age;
   stu *p;//这个有的书上会写成struct stu *p 都一样。
}stu;//(2)
int main{
stu s1,s2;//注意这里的写法
s1.p=&s2;
s1.age=18;
....
}
注意:此结构体中涉及到定义结构体指针stu *p; 这里必须在上面typedef struct stu给出别名,也就是(1)出的stu
         (1),(2)两处的别名可以不一致,也就是struck的名字不必和typedef的名字相同。

typedef struct tagMyStruct
{
 int iNum;
 long lLength;
} MyStruct;

这语句实际上完成两个操作:1) 定义一个新的结构类型struct tagMyStruct 2)为新类型起了一个新名字Mystruct

阅读(1481) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~