可以typedef
使用它来为类型取一个新的名字。
typedef unsigned char BYTE;
typedef struct node
{
char str[50];
struct node *nextNode;
}Node_t;
typedef union
{
char c;
int i;
}Union_t;
为数组类型取别名
#include <stdio.h>
typedef int Arr1_t[4];//一维数组类型
typedef int Arr2_t[][4];//二维数组类型
int main()
{
Arr1_t a[2] = {{1, 2, 3, 4}, {5, 6, 7, 8}};//一维数组,数组的元素是一个数组(4个元素构成)
Arr2_t b = {{1, 2, 3, 4}, {5, 6, 7, 8}};//二维数组
Arr1_t c = {1, 2, 3, 4};
int (*pa)[4];
int (*pb)[4];
int *pc;
pa = a;
pb = b;
pc = c;
printf("%d\n", pa[1][2]);
printf("%d\n", pb[0][2]);
printf("%d\n", pc[3]);
}
/*
输出结果
7
3
3
*/
为指针类型取别名
typedef int *Ptr1_t;//指针类型
typedef int (*Ptr2_t)[4];//指向数组的指针
与#define Ptr1 int *
的区别
#include <stdio.h>
typedef int *Ptr1_t;//指针类型
typedef int (*Ptr2_t)[4];//指向数组的指针
#define Ptr1 int *
int main()
{
Ptr1 a1, a2;
Ptr1_t b1, b2;
printf("a1 = %u\n", sizeof(a1));
printf("a2 = %u\n", sizeof(a2));
printf("b1 = %u\n", sizeof(b1));
printf("b2 = %u\n", sizeof(b2));
}
/*
输出结果
8
4
8
8
*/
可以看到只有a2不是指针类型,a2是int类型。
简而言之,#define 只是字面上的替换,由预处理器执行,#define A B
相当于打开编辑器的替换功能,把所有的 B 替换成 A。
为函数指针取别名
typedef int (*pFunc1)(int, int);
typedef int (*(*pFunc2)(int, int))[4];
其中pFunc2还可以简化
typedef int (*Arr2_t)[4];
//typedef int (*(*pFunc2)(int, int))[4];
typedef Arr2_t (*pFunc2)(int ,int);
typedef与define的区别
- typedef 给出的符号名称仅限于对类型,而不是对值。
例如#define PAI 3.1415926
而typedef不行。 - typedef 的解释由编译器,而不是预处理器执行。并不是简单的文本替换。
- 在连续定义几个变量的时候,typedef 能够保证定义的所有变量均为同一类型,而 #define 则无法保证。
另外,也要注意,typedef 在语法上是一个存储类的关键字(如 auto、extern、mutable、static、register 等一样),虽然它并不真正影响对象的存储特性,如:typedef static int a;