typedef对指针类型取别名的方法以及思考

首先说方法:

简单来说语法就是:
typedef (旧类型名) *(新类型名);//注意在使用新类型名的时候,不加*


比如对整型指针类型取别名

typedef int *INTP;

INTP p = &a;

只关心怎么使用,到这就结束了。但我还是建议你看下面的内容,对你理解typedef、指针的定义很有帮助:

来看这个:

 typedef int *INTP;

1、无论*靠近int还是INTP,在现实中都是可以通过编译 ;所以“*”位置可以随意放;

2、INTP a; ==》int* a;这是定义了一个整形指针变量;INTP就是int*。

如果你有以上两种想法,那么你可以听我下面的一些想法:

1、第一个观点:

        先说结论:*的位置,其实放在哪都是一样的,在语法上没有问题。但是在规范上有点问题!而这个规范问题,能帮助你更好的对typedef理解;

        先说指针变量,定义一个指针变量,写法通常为 int* p; 或者 int *p;(注意*位置的不同);实际上,后者int *p;才比较规范。为什么这么说?c语言中的基本类型中,是有char,int等基本类型,而没有char* int*等类型。 为什么要设计成这样呢,在实际上,这是一个语法的一致性好的例子。把各种指针类型统一到基本类型中。

        比如定义一个整型指针变量,按照上面的思想,是没有所谓的指针类型——int*;所以定义指针变量的方式,是按照定义基本类型变量的方式来走:int *p; 而*p就是一个整型变量,从而p就是对应的指针变量; 所以*的位置,按照规法来讲就是靠近变量侧;

 2、第二个观点

        先说结论: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;其中都体现了语言“一致性”的设计。

3\函数指针的设计也是遵循着原理

int add(int ,int)

它的函数指针:

int (*p)(int ,int)

可见也是把*p看作一个整体.

  • 9
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值