C typedef功能介绍(内附函数指针和指针函数的区别)

2018-01-10  创建人:Ruo_Xiao
开发环境:VS2010
2018-01-11  修改人:Ruo_Xiao
增加指针函数的解释以及和函数指针的区别的理解。

查阅了很多资料,我的理解是:typedef的功能就是创建一个新的数据类型。
解释如下:
1、下面代码实际上是创造了一个新的数据类型:INT,只不过该数据类型的效果和int是一样的。

typedef int INT;
INT i = 0;

2、下面代码表示,typedef创造了一个新的数据类型:PCHAR,该类型的作用是定义字符指针变量。其好处是,PCHAR定义的变量都是字符指针变量。

typedef char* PCHAR;
int _tmain(int argc, _TCHAR* argv[])
{
    PCHAR p1,p2;
    p1 = new char[2];
    p2 = new char[4];
    return 0;
}

3、下面代码中,定义了一个结构体:Pt。在C中,定义Pt的结构体变量,只能带这struct才可以,但是C++则二者均支持。

#include "stdafx.h"
struct Pt
{
    int x;
    int y; 
};

int _tmain(int argc, _TCHAR* argv[])
{
    struct Pt p1;   //C风格   
    Pt p2;  //C++风格

    return 0;
}

在C中,为了解决这个问题,使用下面的代码来代替上面的形式。

#include "stdafx.h"

typedef struct Pt
{
    int x;
    int y; 
} X_Pt;

int _tmain(int argc, _TCHAR* argv[])
{
    struct Pt p1;   //C风格   
    Pt p2;  //C++风格
    X_Pt p3;  //C风格

    return 0;
}

综上,C++支持以上三种定义方式,但是C仅仅支持第1种和第3种。这里,typedef就是创造了一个新的数据类型:X_Pt,该数据类型实际上是一个结构体类型,里面有两个定义,一个是int x,一个是int y。
4、下面代码定义了一个函数指针

int (*pAdd)(int x,int y);

int Add(int x,int y)
{
    return (x+y);
}

int _tmain(int argc, _TCHAR* argv[])
{
    pAdd = Add;
    cout<<"sum = "<<pAdd(2,3)<<endl;
    cin.get();
    return 0;
}

这里大家可以发现,pAdd是一个函数指针变量,里面应该存放的内容是函数的首地址,类似于int *p,p里面存放的内容是int型变量的首地址。之后,我们将Add的函数的首地址赋给了pAdd,完成这个计算过程。
这里需要对这个函数指针变量pAdd的定义过程来一个全新的理解。

int (*pAdd)(int x,int y);
   拆分为 int (*)(int x,int y) 和 pAdd。
   前者的作用相当与int *,只不过int (*)(int x,int y)是用来声明的变量是函数指针,该指针指向的函数是形参为 int xint y ,返回值为int的函数。
   后者是被声明的函数指针变量。

所以,用typedef int(X_Add)(int x,int y)可以理解为typedef char PCHAR,相当于创造一个新的数据类型:X_Add,该数据类型专门定义指定的函数结构的函数指针变量。实例如下:

typedef int (*X_Add)(int x,int y);

int Add(int x,int y)
{
    return (x+y);
}

int _tmain(int argc, _TCHAR* argv[])
{
    X_Add const pAdd = Add;
    cout<<"sum = "<<pAdd(2,3)<<endl;
    cin.get();
    return 0;
}

以上就是typedef常用的用法。
5、拓展
(1)函数指针是一个指针变量,和其他指针变量一样,占4个字节。用来存储指定函数结构的函数的首地址。调用函数的方式是使用函数调用操作符“()”。
(2)指针函数是一个返回值为指针的普通函数。
(3)若一个函数的地址传给了其他函数,其他函数满足一定条件之后,通过函数地址调用了该函数,那么该函数就是回调函数。
例如:

int (*pAdd)(int x,int y);  //定义函数指针变量
int *pAdd(int x,int y);    //定义指针函数

理解方法:
A、函数调用操作符“()”优先级高于“ * ”所以第二种的调用方式是先执行函数pAdd(int x,int y),最后执行“ * ”,所以所到底,其就是一个函数,只不过其返回值是一个指针而已。
B、对于第一种,由于用括号包住了“ * ”和“pAdd”,所以先执行”*pAdd” ,在执行函数调用运算符,所以pAdd就变成了一个指向形参为int x和int y,返回值是int的函数指针变量。

通过上述描述,大家是不是更加理解了二者的区别了呢?

(完)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值