-
变量定义的判断方法
优先级最高的运算符 . -> () []
int *p[5]; / int (p)[5]; / int (p[5]);
由于[] 的优先级要高于 所以第一个和第三个都是指针数组,第二个由于使用了小括号,变量先与结合,所以该类型是数组指针,即指向一个有五个int型元素的数组的指针
int (*p)(void); / int *p(void); / int (p[5])(void) / int ((*p)[5])(void)
第一二个可以明显看出都是函数指针,第三个是一个函数指针数组,第四个是一个指向一个包含五个元素的且元素为函数指针的数组
由于c语言中函数并不能作为数组元素,所以 int *p,5; / int (*p)5; 这两种写法是不合法的 -
函数指针
函数指针的本质也是指针,只不过指向的对象是一个函数,在c中,函数也就代表一块连续的内存地址,而函数名就是这块地址的起始地址
通过函数指针,可以完成完成一些很灵活的功能,而写可以实现程序的分层,下层只要实现好各个模块的功能,然后留出接口供上层调用即可
通过在函数中使用函数指针,可以实现在程序运行过程中实现很多功能,包括回调函数也是函数指针。 -
typedef
typedef是定义类型名的关键字,在所需定义的类型比较复杂时,例如定义一个函数指针,就可以使用typedef关键字,增加代码的可读性和便捷性
typedef和结构体
在不使用typedef定义结构体时,定义结构体变量不光要使用结构体名还要在前面加上struct定义结构体变量
struct keyword
{
int firstname;
int lastname;
char key;
}
strcut keyword keworddef;
如果使用typedef关键字的话,则可以直接在结构体尾部定义结构体类型,而且可以定义多个
typedef struct keyword
{
int firstname;
int lastname;
char key;
} key,*keywords; //结构体变量类型和结构体变量指针类型
key keworddef;
- typedef与const
在使用typedef定义指针类型时,无论是将const加载定义的类型前面还是后面都只能对指针变量产生修饰
所以如果想在使用typedef定义指针类型时定义指向一个常量的话,要在使用typedef时就将typedef添加进去 - typedef在Linux和stm32中的使用
增加可移植性,通过typedef重定义内建类型(ADT),以避免在更换平台时对应操作位数不等的情况