typedef是C/C++中一个很关键的关键字,它的作用是用来给类型起别名。因为在遇上不同数据类型,尤其是复杂类型,typedef的用法有一些细微的差距,所以很多人会有一些疑惑,今天我就来整理一下。

typedef关键字主要用来给一下几种类型起别名:

  • 基本数据类型
  • 结构体
  • 数组
  • 枚举类型
  • 指针
  • 函数指针
  • 指针函数

1. 基本数据类型

使用typedef给基本数据类型起别名很简单:

//typedef关键字 数据类型 别名
typedef int Myint;
typedef double Mydouble;

起了别名以后,别名就相当于原类型名的同义词,能使用原类型的地方就可以使用别名。

2. 结构体

和基本数据类型类似,将别名放在结构体之后

struct Person{
    string name;
    int age;
};
//typedef关键字 结构体 别名
typedef struct Person P;

3. 数组

给数组起别名时,typedef的用法和单个元素有些区别,别名被挤在数组元素类型和数组元素个数之间。

//typedef关键字 数组元素类型 别名[数组元素个数]
typedef int C[10];
C t;  // t的类型是int[10],也就是包含10个int类型的数组

4. 枚举类型

和结构体类型类似

enum Color{Red,Green,Blue} primaryColor;
//typedef关键字 枚举类型 别名
typedef Color primaryColor;
primaryColor G = Red

5. 指针

//typedef关键字 指针 别名
typedef char*String;
String l = "name";

对指针起别名需要注意的一点就是,如果要对别名加const关键字,必须要知道,我们声明的是一个常量指针,而不能将其按照字面上,理解为指向常量的指针。

typedef char*String;
char*p = "hello";
const String P = p;
//P++;  // 错误,P是常量指针,无法自增
const char*S; // 如果将typedef的内容直接替换,很容易得到本行的结果,但这是错误的理解,它一个指向常量的指针
S = p;
S++; //S是指向常量字符的指针,可以自增

6. 函数指针

 给函数指针起别名也和上面的方法类似

//typedef关键字 返回值类型 别名 参数类型
typedef int(*Func)(int,int);
Func Max;  //Max是一个函数指针

7.指针函数

//typedef关键字 返回值类型 别名 参数类型
typedef int*Func2(int,int );
Func2 Min;

总结

typedef关键字可以给多种数据类型赋值,如果每种情况都单独去记,可能也不太记得住,所以我在这里推荐一个小技巧:

去掉typedef关键字,将原先的别名视为一个变量,这个变量是什么类型,那么这个别名就是这个类型的同义词。

例如

typedef double D;
typedef int A[10];

去掉typedef关键字后,D为double类型,那么加上typedef关键字后,D即为double的同义词;去掉typedef关键字后,A为int[10]类型,那么加上typedef关键字后,A即为int[10]的同义词。希望这个技巧,有助于大家理解typedef关键字。