C语言typedef

C语言中提供typedef 关键字,typedef是在C语言中用来为复杂的声明定义简单的别名,它与宏定义有些差异。它本身是一种存储类的关键字,与auto、extern、mutable、static、register等关键字不能出现在同一个表达式中。本文主要介绍C语言中typedef的使用。

1、typedef定义及使用

使用typedef关键字为指定类型取一个别名,可以为char*取一个别名为pStrtypedef 是用于为现有类型定义别名的关键字,使代码更简洁易读。常用于简化结构体、指针、函数指针、多维数组等复杂类型的使用,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; 

上面示例中,s1s2s3都被定义为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;
}


推荐阅读
cjavapy编程之路首页