C语言中的"typedef"
一、什么是typedef
typedef是用于定义新的类型名,在编程中可以用typedef来定义新的类型名来代替已有的类型名
格式:
typedef 已有类型名 新的类型名
通俗点说,就是为已有的类型取别名,例如 老鼠🐀,又叫耗子🐀,老鼠也是它,耗子也是他
但不能取新的类型名,也就是说不能凭空造出来一个类型,必须是在已有的类型名的基础上进行取别名
typedef可用于定义各种类型名,但不能定义变量。即只要见到typedef则该语句最后的标识符必定是一个类型名而不是变量名。
二、使用方法及注意事项
- typedef a b ; (a为已有类型名,b为新的类型名)
我们知道C语言中没有string字符串,我们就可以通过C语言中的typedef来定义一个string(当然,这和C++语言中的string有很大的区别)。
#include<stdio.h>
typedef char string[20];
int main(){string s = "asdasdasdas"; printf("%s\n",s);return 0;
}
运行结果:
当然这种投机取巧的方法有很多的弊端,例如,char的数组长度的设置不好控制等,当然我们通过查看string的类型,发现,它实质上还是一个char数组的类型,代码如下:
#include<bits/stdc++.h>
#include<cxxabi.h>
using namespace std;
typedef char tring[20];
int main(){int a=10;int b=10;string str = "dwefwefwe";tring s = "asdasdasdas";tring d = "asdasdasdas";printf("%s\n",s);cout<<"a的类型是:"<<abi::__cxa_demangle(typeid(a).name(),0,0,0)<<endl;cout<<"b的类型是:"<<abi::__cxa_demangle(typeid(b).name(),0,0,0)<<endl;cout<<"s的类型是:"<<abi::__cxa_demangle(typeid(s).name(),0,0,0)<<endl;cout<<"d的类型是:"<<abi::__cxa_demangle(typeid(d).name(),0,0,0)<<endl;cout<<"str的类型是:"<<abi::__cxa_demangle(typeid(str).name(),0,0,0)<<endl;return 0;
}
由于使用查找类型函数需要用到C++的库函数,所以我们讲string改为了tring。
- typedef a b[] ; typedef a *b ;(a为已有类型名,b为新的类型名)
#include<bits/stdc++.h>
#include<cxxabi.h>
using namespace std;
typedef char tring[20];
typedef int array[2];
int main(){array a[3];array b[4];tring s[22];tring d[12];cout<<abi::__cxa_demangle(typeid(a).name(),0,0,0)<<endl;cout<<abi::__cxa_demangle(typeid(b).name(),0,0,0)<<endl;cout<<abi::__cxa_demangle(typeid(s).name(),0,0,0)<<endl;cout<<abi::__cxa_demangle(typeid(d).name(),0,0,0)<<endl;return 0;
}
运行结果:
- typedef 已有类型名 新的类型名
#include<stdio.h>
#include<bits/stdc++.h>
#include<cxxabi.h>
using namespace std;
typedef int *p;
typedef int a;
int main(){a b=5;p c=&b;p *d = &c;printf("%d\n",b);printf("%d\n",*c);printf("%d\n",**d);printf("%p\n",&b);printf("%p\n",&c);printf("%p\n",&d);cout<<abi::__cxa_demangle(typeid(b).name(),0,0,0)<<endl;cout<<abi::__cxa_demangle(typeid(c).name(),0,0,0)<<endl;cout<<abi::__cxa_demangle(typeid(d).name(),0,0,0)<<endl;
}
运行结果:
总结:
- typedef不能取新的类型名,typedef只用于重命名,目的是使复杂变量名简单化。
- 只要见到typedef则该语句最后的标识符必定是一个类型名而不是变量名。