C语言中typedef的用法

typedef关键字的用法

 

(1)typedef是C语言中一个关键字,typedef定义(或者叫重命名)类型而不是变量,类型是一个数据模板,变量是一个实在的数据。类型是不占内存的,而变量是占内存的;面向对象的语言中:类型就是类class,变量就是对象。

 

(2)C语言中的类型一共有2种:一种是编译器定义的原生类型(基础数据类型,如int、double之类的);第二种是用户自定义类型,不是语言自带的是程序员自己定义的(譬如数组类型、结构体类型、函数类型·····)。

(3)数组指针、指针数组、函数指针等都属于用户自定义类型。

(4)有时候自定义类型太长了,用起来不方便,所以用typedef给它重命名一个短点的名字。

(5)注意:typedef是给类型重命名,也就是说typedef加工出来的都是类型,而不是变量。

typedef与#define宏的区别
typedef char *pChar;
#define pChar char *

typedef与结构体
(1)结构体在使用时都是先定义结构体类型,再用结构体类型去定义变量。
(2)C语言语法规定,结构体类型使用时必须是struct 结构体类型名 结构体变量名;这样的方式来定义变量。
(3)使用typedef一次定义2个类型,分别是结构体变量类型,和结构体变量指针类型。

// 我们一次定义了2个类型:
// 第一个是结构体类型,有2个名字:struct teacher,teacher
// 第二个是结构体指针类型,有2个名字:struct teacher *, pTeacher
typedef struct teacher
{
char name[20];
int age;
int mager;
}teacher, *pTeacher;

typedef与const
(1)typedef int *PINT; const PINT p2; 相当于是int *const p2;
(2)typedef int *PINT; PINT const p2; 相当于是int *const p2;
(3)如果确实想得到const int *p;这种效果,只能typedef const int *CPINT; CPINT p1;

typedef int *PINT;
typedef const int *CPINT;


// const int *p和int *const p是不同的。前者是p指向的变量是const,后者是p本身const

int main(void)
{
int a = 23;
int b = 11;

CPINT p = &a;
*p = 33; // error: assignment of read-only location ‘*p’
p = &b;

/*
PINT const p = &a;

*p = 33;
p = &b; // error: assignment of read-only variable ‘p’
*/
/*
PINT p1 = &a;

const PINT p2 = &a; // const int *p2; 或者 int *const p2;
*p2 = 33;
printf("*p2 = %d.\n", *p2);

p2 = &b; // error: assignment of read-only variable ‘p2’
*/

使用typedef的重要意义(2个:简化类型、创造平台无关类型)
(1)简化类型的描述。
char *(*)(char *, char *); typedef char *(*pFunc)(char *, char *);
(2)很多编程体系下,人们倾向于不使用int、double等C语言内建类型,因为这些类型本身和平台是相关的(譬如int在16位机器上是16位的,在32位机器上就是32位的)。为了解决这个问题,很多程序使用自定义的中间类型来做缓冲。譬如linux内核中大量使用了这种技术.
内核中先定义:typedef int size_t; 然后在特定的编码需要下用size_t来替代int(譬如可能还有typedef int len_t)
(3)STM32的库中全部使用了自定义类型,譬如typedef volatile unsigned int vu32;

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值