对指针和函数指针定义别名涉及到优先级,查看《C语言声明的优先级》那篇
1、
C语言typedef的用法详解 (biancheng.net)
typedef char CHAR20[20]; //CHAR20是类型char [20]的别名。它是一个长度为 20 的数组类型 CHAR20 a1, a2, a3, a4; //char a1[20], a2[20], a3[20], a4[20]
#include <stdio.h> typedef char (*PTR_TO_ADDR)[30]; //PTR_TO_ARR是二位数组char *[30]的别名,是二维数组指针类型 char str[3][30] = { "hello", "world", "!" }; int main() { PTR_TO_ADDR paddr = str; int i; for(i=0; i<3; i++) { printf("%s ", paddr[i]); } }
运行结果:
hello world !
2、typedef
学习链接:初识 typedef void(*Func)(void) (qq.com)
void (* fun)(void)
fun是一个变量,它是个指针,指向一个函数,函数的参数和返回值都是空,fun是一个指向参数和返回值都为空的函数指针。
type void (* fun)(void)是函数指针的类型定义,代表了一种新的类型,声明一种void (*)(void)类型的函数指针fun。
typedef为现有类型创建一个新的名字,typedef能隐藏笨拙的语法构造以及平台一些相关的数据类型,增强代码可维护性、可移植性、可读性
#include <stdio.h>
typedef void (*PTR_TO_FUN)(int, int); //PTR_TO_FUN是一个函数指针
void max(int a, int b){
int c;
c = a>b ? a : b;
printf("%d
", c);
}
int main()
{
PTR_TO_FUN pfun = &max; //&可加可不加
pfun(10, 20); //第一种调用方式
(*pfun)(10, 20); //第二种调用方式
}
结果:
20 20
3、typedef 和 #define 的区别
typedef 是在编译过程中被解析的,而#define
是在编译之前的预处理阶段处理的;#define
只是对所定义的别名的简单替换,而typedef可以做到#define
能做到的所有事情,而且可以做得更好
(1)可以使用其他类型说明符对宏类型名进行扩展,但对 typedef 所定义的类型名却不能这样做
#define INTERGE int unsigned INTERGE n; //没问题 typedef int INTERGE; unsigned INTERGE n; //错误,不能在 INTERGE 前面添加 unsigned
(2)在连续定义几个变量的时候,typedef 能够保证定义的所有变量均为同一类型,而 #define 则无法保证
#define PTR_INT int * PTR_INT p1, p2; //int *p1, p2;
typedef int * PTR_INT PTR_INT p1, p2; //int *p1, *p2;