之前无论在阅读带有typedef
的语句或者自己写一个typedef
语句时,都会很麻烦。
最近有空看了一个他的详细用法,总结出了一个自己的想法:
例如:、
//对于一个二维数组
typedef int (*int_array)[4];
typedef int *int_point;
int a[2][4] = { { 1,2,3,4, },{ 5,6,7,8, } };
for (int_array p = a; p != a + 2; ++p)
{
for (int_point q = *p; q != *p + 4; ++q)
{
cout << *q << endl;
}
}
如何阅读类型别名?
第一行的typedef int (*int_array)[4];
该怎么理解他呢?
可以这样看:去掉开始的typedef
,只保留下int (*int_array)[4];
。
此时把int_array
看成一个变量的名字,这个语句就变成一个声明变量的语句。
这就可以看出来int_array
是一个int (*)[4]
类型的变量了。
同样的,对于第二行的typedef int *int_point;
语句,可以用相同的方式理解:
去掉typedef
后,保留下int *int_point;
,
可以看出int_point
是一个int*
类型的变量。
怎么写带有typedef
的语句?
其实写typedef
语句的过程和阅读过程正好相反:
1、如果要对一个数据类型申请一个别名,首先写出一个 申请一个该类型的变量的语句;
2、将变量名字替换成你自定义的类型名;
3、在开头加上typedef
即可。
例如:
//还是以二维数组为例
int a[2][4] = { { 1,2,3,4, },{ 5,6,7,8, } };
如果我想对a的类型取一个别名,则需要先确定a的类型;
a = &a[0];
因此a是一个一维数组的指针;
所以a的类型是 int (*)[4]
按照步骤1,写出一个声明该类型变量的语句:
int (*p)[4]; //声明语句
接着按照步骤2,将变量名替换成自己自定义的类型名。
int (*int_array)[4]; //将变量名替换成自己自定义的类型名。
按照步骤3,在开头加上typedef
即可。
typedef int (*int_array)[4]; //在开头加上`typedef`即可。
最后补充一个笔记,也是自己经常搞混的地方
typedef int *type[4];
typedef int (*type1)[4];
cout << sizeof(type) << endl; //输出16,type是一个包含有四个指针的一维数组
cout << sizeof(type1) << endl; //输出4,type1是一个数组指针