首先说方法:
简单来说语法就是:
typedef (旧类型名) *(新类型名);//注意在使用新类型名的时候,不加*
比如对整型指针类型取别名
typedef int *INTP;
INTP p = &a;
只关心怎么使用,到这就结束了。但我还是建议你看下面的内容,对你理解typedef、指针的定义很有帮助:
typedef int *INTP;
1、无论*靠近int还是INTP,在现实中都是可以通过编译 ;所以“*”位置可以随意放;
2、INTP a; ==》int* a;这是定义了一个整形指针变量;INTP就是int*。
如果你有以上两种想法,那么你可以听我下面的一些想法:
先说结论:*的位置,其实放在哪都是一样的,在语法上没有问题。但是在规范上有点问题!而这个规范问题,能帮助你更好的对typedef理解;
先说指针变量,定义一个指针变量,写法通常为 int* p; 或者 int *p;(注意*位置的不同);实际上,后者int *p;才比较规范。为什么这么说?c语言中的基本类型中,是有char,int等基本类型,而没有char* int*等类型。 为什么要设计成这样呢,在实际上,这是一个语法的一致性好的例子。把各种指针类型统一到基本类型中。
比如定义一个整型指针变量,按照上面的思想,是没有所谓的指针类型——int*;所以定义指针变量的方式,是按照定义基本类型变量的方式来走:int *p; 而*p就是一个整型变量,从而p就是对应的指针变量; 所以*的位置,按照规法来讲就是靠近变量侧;
先说结论:INTP 不能直接看成int*;因为两者不是一个东西;
先看一段代码
typedef int *INTP;
int a,b,c; //abc都是整型
int* a,b,c; //a:整形指针类型,b整型,c整型
INTP a,b,c; //abc都是整形指针类型
通过上面的代码,想必能看出区别来,那么解释一下为什么;
int a,b,c; //一次定义多个“整型”变量;
int*a,,b,c;//一次定义多个“int*”变量 !这句话是错误的! 正确的说法是只有a是指针变量
INTP a,b,c;//一次定义多个“整型指针类型”变量;
发现没有,只有int* 不能套这个注释的模板!
具体解释一下:
从上面“观点1”可得知,
1、是没有int*这种类型的,所有用int*定义变量的时候,就不能按照常规的类型定义变量的方式去理解。
2、把int* a,b,c;具体看一下,其实就是 int *a,b,c;(注意*按照规法是靠近变量),
一次定义多个“整型”变量。*a,b,c都是整型;*a是整型,a才是“整型指针型”;所以在上面代码的注释中,才说a是指针,bc是整型。
另外,为什么INTP a,b,c;都是指针呢?
首先我们先看这两种typedef的区别
typedef int* INTP;
typedef int *INTP;
//两种方式都对,但是第二种会更符合“规范”
为什么说第二种,更符合规范呢?我来解释一下:
首先从上面我们都明白,在定义指针变量的时候,*靠近变量更加规范,那么在使用typedef的时候,这种“规范”从什么地方体现的呢?
首先,我们假设用的是一种方式——typedef int* INTP;
我们都是知道typedef就是给类型起个别名,比如typedef int INT32;就是用INT32来代替int这个类型的名字,从而去定义各种变量。
对于指针而言也是这样的啊,不可能搞个特殊区别,要不然这个语言整体性和易用性就不好了。
接上面的继续说,按照这种方式,我们很容易理解成INTP就是int*类型的别名。其实这种理解是错误的。上面已经对此介绍过,是没有int*这种类型的。所以在这个错误的视角上,去理解int* a,b,c;的问题,肯定会理解错误。
那么开头说的不规范的原因其实也在这,typedef int* INTP这种写法,特别容易让我们迷惑的认为——INTP就是int*类型的别名;
那么正确的的理解是是什么?
typedef 既然是给类型取别名,首先你要取别名的类型是正确的;那么这个取别名的规范是什么呢?大家可以代入一下语言设计者的角度想一想,肯定是有“统一性”更好;
为了理解我举个例子:
比如typedef int INT32;“翻译一下”就是:typedef 整型 整型的另一个名字
那么到了指针这块,为了统一性,也必须这么来
typedef int *INTP;“翻译一下”就是:typedef 整型 整型的另一个名字
*INTP只不过是整型的另一个名字,他还是整型,所以去掉*后,INTP就是整形指针类型!
举个小例子:*a=3;那么 *a 是整型变量,a呢?就是整型指针变量;
我们重新来理解下这语句:
typedef int *INTP;
int a,b,c; //abc都是整型
int* a,b,c; //a:整形指针类型,b整型,c整型
INTP a,b,c; //abc都是整形指针类型
int a,b,c; //整型确实存在,所以可以一次定义了多个“整型”变量;
int*a,b,c; //int* 没有这种类型,所以不能一次定义多个;而之所以这个语句能执行,是因为这个语句真正的类型是int!
所以实际上是这么说--整型确实存在,所以可以一次定义了多个“整型”变量;
INTP : //整形指针类型确实存在,所以可以一次定义了多个“整形指针类型”变量。
有人可能问:int*这种类型不是不存在吗?为什么还说整形指针类型存在?
答:你可能还是把int*等同整型指针类型!我说的是int*不存在,而不是“整型指针类型”不存在;
从上面我们可以看到:
无论是在定义指针变量:int *a; 还是在使用 typedef int *INTP;其中都体现了语言“一致性”的设计。