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 x 和 int 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的函数指针变量。
通过上述描述,大家是不是更加理解了二者的区别了呢?
(完)