C语言笔记之typedef

typedef 这个关键字用于给一个类型起个新的名字,和define不同, typedef 给出的符号名称仅限于对类型 , 而不是对值。下面是一个例子:

typedef short wchar;   

typedef将short类型定义成wchar类型,那么以后遇到 wchar a; 其实就是 short a;  如果没有typedef这个关键字,wchar就是一个变量名,加上typedef,wchar就成了类型名。类型名也遵循标识符的命名规则,并且通常加个 _t 后缀,表示Type。

这样做有什么用处呢?仅仅从short这种基本类型是看不出来好处的,typedef的强大之处在于重定义复合类型,给复合类型一个新的名字,以后就可以直接使用新名字来声明变量,而不必写一堆长长的复合类型。当然,某些情况下,也需要对基本类型重命名,比如平台移植之类的。

下面分几种情况描述typedef的用法。

1、指针

考虑这么一个声明:

typedef char * string;

那么string就是一个指针类型,它指向char类型。于是,

string a,b;  

就定义了两个指针变量,它们都指向char类型的变量。相当于:

char *a, *b;


2、数组

typedef int  array[5];

array就是一种新类型,它代表有5个int类型数值的数组,array  new;  就相当于 int new[5];

这个形式理解起来有点费力,可以采用上面的方法:如果没有typedef,那么array就是一个普通的数组名;有了typedef , array就成了一个类型名。


3、结构体

结构是typedef的主要战场,因为一般结构体实在太长了,只有重命名才能简化代码。比如下面这个:

struct {

int a;

double *b;

char name;

} sth;

然后,声明变量时虽然可以这样: struct sth one, two;  但是每次都要写一个struct仍然比较烦。好的办法是这样:

typedef struct {

int a;

double *b;

char name;

} sth;

然后就可以直接 sth one, two; 了。


4、函数

你没看错,typedef甚至可以定义函数类型!!如下:

typedef int func(double var);

这样就定义了一个函数类型func,以后就可以用func来定义变量。这条语句的理解同上面,先去掉typedef,再加上typedef,看func的含义变化。

比如下面的语句定义了一个func型变量:

func a;

但是这个变量不能被赋值,因为这条语句相当于做了一个声明:

int a(double var);

然而这也是定义func类型的初衷,定义func类型是为了方便定义指向此类函数的指针,如下:

func *a;

这样就定义了一个函数指针a,它只能指向func类型的函数,所谓func类型的函数是指:返回值为int,而参数只有一个double。也就是说,判断一个函数是不是func型的,只需要检查它的返回值类型,参数个数及类型,而不管具体的实现。

比如下面实现了两个func型函数:

int func1(double var1)

{

return (int)var1;

}


int func2(double var2)

{

return 0;

}


那么我们可以令a = &func1; 也可以 a = &func2;

这里需要探讨一下函数名到底意味着什么?实际上,函数名同数组名一样,是一个地址。数组名代表着数组首元素的地址,函数名代表着函数第一条指令的地址。

既然函数名就是地址,我们当然也可以这样赋值:a = func1;  这同数组名是一样的,但是这种赋值暗含了类型转换,func1是func函数类型(的变量?),而&func1则是函数指针类型(的变量?),只是做右值时自动类型转换罢了。

赋值时候才可以直接使用函数指针,如:

a(2.6);

相当于调用func1(2.6); (如果a = func1)


以上就是typedef的一些主要用法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值