如何读懂typedef与typedef的用法


typedef 用来给类型取别名

1基本数据类型

如何定义:

typedef int INT;//给int起一个别名为INT
INT i=0;

如何读懂:typedef int INT;

通用方法: 去掉typedef 然后用变量名 替换掉 typedef语句中的新名字

例如上面的 INT i=0;

我们可以复制 typedef int INT; 去掉里面的 typedef  就剩下 int INT; 了

再用变量名 i 换掉定义的新名字INT 就变成了   int i

所以 INT i=0;就等同于替换后的结果 int i=0;

2数组起别名

如何定义:

	typedef int ARRAY[3];
	ARRAY arr;

如何读懂:typedef int ARRAY[3];

通用方法: 去掉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 char STR[3][10];

通用方法: 去掉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 int(*pAdd)(int,int);

通用方法: 去掉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