1、typedef定义及使用
使用typedef
关键字为指定类型取一个别名,可以为char*
取一个别名为pStr
。typedef
是用于为现有类型定义别名的关键字,使代码更简洁易读。常用于简化结构体、指针、函数指针、多维数组等复杂类型的使用,typedef
不会创建新的数据类型,只是为已有类型提供了一个新的名字。在大型项目中,typedef
可以提升代码的可维护性和可读性。
例如,
typedef char* pStr;
例如,
#include <stdio.h> #include <string.h> typedef struct Books { char title[50]; char author[50]; char subject[100]; int book_id; } Book; int main( ) { Book book; strcpy( book.title, "C 教程"); strcpy( book.author, "cjavapy"); strcpy( book.subject, "编程语言"); book.book_id = 1; printf( "书标题 : %s\n", book.title); printf( "书作者 : %s\n", book.author); printf( "书类目 : %s\n", book.subject); printf( "书 ID : %d\n", book.book_id); return 0; }
2、typedef 和 #define区别
typedef
定义一种类型的别名,而不是简单的宏替换。
typedef
仅限于为类型定义符号名称,#define
不仅可以为类型定义别名,也能为数值定义别名,比如可以定义 1 为 ONE。typedef
是由编译器执行解释的,#define
语句是由预编译器进行处理的。
例如,
typedef char* pStr1; #define pStr2 char*; pStr1 s1,s2; pStr2 s3,s4;
上面示例中,s1
、s2
、s3
都被定义为char *
,而s4则定义成了char
,不是我们所预期的指针变量(相当于:char *s3,s4;
)。根本原因就在于#define
只是简单的字符串替换而typedef
则是为一个类型指定别名。
例如,
#include <stdio.h> #define TRUE 1 #define FALSE 0 typedef char* pStr1; #define pStr2 char* pStr1 s1,s2; pStr2 s3,s4; int main( ) { printf("size of s1 is: %d\n",sizeof(s1));//char* 类型 printf("size of s2 is: %d\n",sizeof(s2));//char* 类型 printf("size of s3 is: %d\n",sizeof(s3));//char* 类型 printf("size of s4 is: %d\n",sizeof(s4));//char类型 printf( "TRUE 的值: %d\n", TRUE); printf( "FALSE 的值: %d\n", FALSE); return 0; }
3、使用 typedef 简化结构体
C语言中,结构体的声明比较繁琐,每次声明结构体变量时都需要使用 struct
关键字。typedef
可以使结构体的使用更简洁。
#include <stdio.h> // 使用 typedef 为结构体定义别名 typedef struct { int x; int y; } Point; int main() { Point p1; // 现在可以直接使用 Point 而不是 struct 关键字 p1.x = 5; p1.y = 10; printf("Point p1: (%d, %d)\n", p1.x, p1.y); return 0; }
4、typedef 和指针
在处理指针类型时,typedef
可以极大地简化代码,使得指针类型的变量声明更清晰。
#include <stdio.h> typedef int* IntPointer; int main() { int a = 10; IntPointer p = &a; // IntPointer 等价于 int* printf("Value of a: %d\n", *p); return 0; }
5、typedef 和复杂数据类型
对于多重指针或函数指针等复杂类型,typedef
可以大大简化代码,使声明和使用更易读。
#include <stdio.h> // 定义一个函数指针类型 typedef void (*FuncPointer)(int); void printNumber(int num) { printf("Number: %d\n", num); } int main() { FuncPointer fp = printNumber; // FuncPointer 等价于 void (*)(int) fp(42); // 使用函数指针调用函数 return 0; }
6、typedef 和多维数组
typedef
也可以用于简化多维数组的声明,特别是在处理矩阵或其他高维数据时。
#include <stdio.h> // 定义一个3x3的二维数组类型 typedef int Matrix3x3[3][3]; int main() { Matrix3x3 matrix = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9} }; for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { printf("%d ", matrix[i][j]); } printf("\n"); } return 0; }