typedef 用来给类型取别名
1基本数据类型
typedef int INT;//给int起一个别名为INT INT i=0;
通用方法: 去掉typedef 然后用变量名 替换掉 typedef语句中的新名字
例如上面的 INT i=0;
我们可以复制 typedef int INT; 去掉里面的 typedef 就剩下 int INT; 了
再用变量名 i 换掉定义的新名字INT 就变成了 int i
所以 INT i=0;就等同于替换后的结果 int i=0;
typedef int ARRAY[3]; ARRAY arr;
通用方法: 去掉typedef 然后用变量名 替换掉 typedef语句中的新名字
例如上面的 ARRAY arr;
我们可以复制 typedef int ARRAY[3]; 去掉里面的 typedef 就剩下 int ARRAY[3]; 了
再用变量名 arr 换掉定义的新名字ARRAY 就变成了 int arr[3]
所以 ARRAY arr;就等同于替换后的结果 int arr[3]
实验代码如下:
typedef int ARRAY[3]; ARRAY arr; printf("%d\n", sizeof(arr)); //会输出12 ARRAY arr1 = { 1, 2, 3 };//这样是正常的 //ARRAY arr2 = { 1, 2, 3, 4 }; 这样就会提示 "初始值设置的项值太多"
二维数组:
typedef int ARRAY[3]; ARRAY arr[4]; //此时arr会变成一个二维数组 printf("%d\n", sizeof(arr)); //会输出48 3*4*4 /*以下两句结果一样*/ ARRAY arr2w[2] = { 1, 2, 3, 4, 5, 6 }; int arr3[3][2] = { 1, 2, 3, 4, 5, 6 };
例如上面的 ARRAY arr[4];
我们可以复制 typedef int ARRAY[3]; 去掉里面的 typedef 就剩下 int ARRAY[3]; 了
再用变量名 arr[4] 换掉定义的新名字ARRAY 就变成了 int arr[4][3]
所以 ARRAY arr[4];就等同于替换后的结果 int arr[4][3]
typedef char STR[3][10]; STR str;
通用方法: 去掉typedef 然后用变量名 替换掉 typedef语句中的新名字
例如上面的 STR str;
我们可以复制 typedef char STR[3][10] 去掉里面的 typedef 就剩下 char STR[3][10]; 了
再用变量名 str 换掉定义的新名字STR 就变成了 char str[3][10]
所以 STR str;就等同于替换后的结果 char str[3][10]
实验代码如下:
typedef char STR[3][10]; STR str; printf("%d\n", sizeof(str)); //会输出30 STR str2 = {"aaaaa","bbbbb","cssss"}; for (int i = 0; i < 3; i++){ puts(str2[i]); }
例如函数声明为:
int add(int a, int b){ return a + b; }
使用(*指针名称)替换掉函数声明里的函数名,其中型参可以省略,只写类型
定义类型为pAdd的函数指针
typedef int(*pAdd)(int,int);// 声明一个类名为pAdd函数指针 pAdd fun;//定义变量 fun = add;//给 fun赋值 也可以写成 pAdd fun = &add; int a=fun(5, 6); //调用函数
通用方法: 去掉typedef 然后用变量名 替换掉 typedef语句中的新名字
例如上面的 pAdd fun;
我们可以复制 typedef int(*pAdd)(int, int) 去掉里面的 typedef 就剩下int(*pAdd)(int, int)了
再用变量名 fun 换掉定义的新名字pAdd 就变成了int(*fun)(int, int)
所以pAdd fun;就等同于替换后的结果: int(*fun)(int, int);
实验代码如下:
#include <stdio.h> int add(int a, int b){ return a + b; }//声明一个add函数 int main(){ //原始方法1:声明函数指针 int(*fun1)(int, int); fun1 = add; printf("%d\n", fun1(10,20)); //原始方法2:声明函数指针 int(*fun2)(int, int) = add; printf("%d\n", fun2(7, 8)); //使用typedef定义函数指针类型 typedef int(*pAdd)(int a, int b);// 声明一个类型为pAdd函数指针 //使用新类型声明函数指针 pAdd fun; fun = add;//给 fun赋值 也可以写成 pAdd fun = &add; printf("%d\n", fun(5, 6));//调用函数 getchar(); return 0; }
以上都是先初步声明变量 后单独赋值,适用于初步学习来理解
如果是声明变量顺便赋值 就不能按上面方法来转换了
例如: pAdd fun = add;这样的,就要用其他方式去理解了
相关视频教程:
https://www.bilibili.com/video/BV1ue4y1E7gF