typedef函数

文章详细解释了C语言中typedef的作用,包括给已定义的变量类型起别名,定义函数指针类型,数组指针类型以及数组类型。指出typedef在这些场景下的重要性,强调了即使不加typedef,类型本质上是相同的,但typedef提供了更好的可读性和类型明确性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、给已定义的变量类型起个别名

//uint8_t就是unsigned char的别名,这是最基础的用法
typedef unsigned char uint8_t;   
    
struct __person
{
    char    name[20];
    uint8_t age;
    uint8_t height;
};
typedef __person person_t;

//以上两段代码也可合并为一段,如下:
typedef struct __person
{
    char    name[20];
    uint8_t age;
    uint8_t height;
}person_t;

二、定义函数指针类型

  1. 定义函数指针变量
    ① int (*pFunc)(char frame, int len);
    定义了一个函数指针变量pFunc,它可以指向这样的函数:返回值为int,形参为char
    、int
    ② int *(pFunc[5])(int len);
    定义了5个函数指针变量:pFunc[0]、pFunc[1]···,它们都可以指向这样的函数:返回值为int
    ,形参为int

  2. 定义函数指针类型
    定义函数指针类型,必须使用typedef,方法就是,在“定义函数指针变量”加上typedef。

//定义了一个类型函数指针pFunc_t
typedef  int (*pFunc_t)(char *frame, int len);

//定义了一个类型pFunc_t
typedef  int (*pFunc_t)(char *frame, int len); 

int read_voltage(char *data, int len)
{
    int voltage = 0;
    ···//其他功能代码
 
    return voltage;
}
int main(void)
{
	//使用类型pFunc_t来定义函数指针变量
    pFunc_t  pHandler = read_voltage;
    ···//其他功能代码
}

三、定义数组指针类型

这个问题还是分两步,先看如何定义数组指针变量,再看如何定义数组指针类型

1、定义数组指针变量

① int(*pArr)[5];//定义了一个数组指针变量pArr,pArr可以指向一个int [5]的一维数组

② char(*pArr)[4][5];///定义了一个数组指针变量pArr,pArr可以指向一个char[4][5]的二维数组

int(*pArr)[5];//pArr是一个指向含5个int元素的一维数组的指针变量
int a[5] = {1,2,3,4,5};
int b[6] = {1,2,3,4,5,6};
pArr = &a;//完全合法,无警告
pArr = a;//发生编译警告,赋值时类型不匹配:a的类型为int(*),而pArr的类型为int(*)[5]
pArr = &a[0];//发生编译警告,赋值时类型不匹配:a的类型为int(*),而pArr的类型为int(*)[5]
pArr = &b;//发生编译警告,赋值时类型不匹配:&b的类型为int(*)[6],而pArr的类型为int(*)[5]
pArr = (int(*)[5])&b;//类型强制转换为int(*)[5],完全合法,无警告

2、定义数组指针类型
如同上面定义函数指针类型的方法,直接在前面加typedef即可,例如

typedef int (*pArr_t)[5];//定义了一个指针类型pArr_t,该类型的指针可以指向含5个int元素的数组

typedef int(*pArr_t)[5];//定义一个指针类型,该类型的指针可以指向含5个int元素的一维数组

int main(void)
{
    int a[5] = {1,2,3,4,5};
    int b[6] = {1,2,3,4,5,6};
    pArr_t pA;//定义数组指针变量pA
    pA= &a;//完全合法,无警告    
    pA= (pArr_t)&b;//类型强制转换为pArr_t,完全合法,无警告
}

四、定义数组类型

如果我们想声明一个含5个int元素的一维数组,一般会这么写:int a[5];

如果我们想声明多个含5个int元素的一维数组,一般会这么写:int a1[5], a2[5], a3[5]···,或者 a[N][5]

可见,对于定义多个一维数组,写起来略显复杂,这时,我们就应该把数组定义为一个类型,例如:

typedef int arr_t[5];//定义了一个数组类型arr_t,该类型的变量是个数组
 
typedef int arr_t[5];
int main(void)
{
    arr_t d;        //d是个数组,这一行等价于:  int d[5];
    arr_t b1, b2, b3;//b1, b2, b3都是数组
    
    d[0] = 1;
    d[1] = 2;
    d[4] = 134;
    d[5] = 253;//编译警告:下标越界
}

总结

总结一句话:“加不加typedef,类型是一样的“,这句话可以这样理解:
没加typedef之前如果是个数组,那么加typedef之后就是数组类型;
没加typedef之前如果是个函数指针,那么加typedef之后就是函数指针类型;
没加typedef之前如果是个指针数组,那么加typedef之后就是指针数组类型

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值