函数指针
我们经常会需要动态的调动几个函数的某一个,如果我们只是if else那代码量可能有时候会比较大,有没有可以在函数参数中直接传递一个函数呢?
答案是不可能的,但是我们有一种方式可以实现,那就是通过指针函数来说。
typedef void (*pf)(int &m,int *n);
这是什么意思呢?他的意思就是说pf是一个指针函数,他可以指向任意的返回值为void,并且参数是int &m和int *n的函数。
同样我们声明pf f;就可以把f作为一个函数了,也可以把f当做一个参数传到函数体中了。具体例子见下面。
1 void swap(int &m,int *n); //定义一个有两个参数的函数swap
2 typedef void (*pf)(int &m,int *n);//
3 void print(int &m,int *n,pf x);//定义一个能传递指针函数的函数
4 int _tmain(int argc, _TCHAR* argv[])
5 {
6 int m=6,q=20;
7 pf f=swap;
8 int* n=&q;
9 f(m,n);
10 cout《&m《*n;
11 print(m,n,f);
12 system("pause");
13 return 0;
14 }
同样的道理,我们也可以返回一个指针函数,只不过返回类型是pf.它返回的实际类型应该是 void (*)(int&,int*);解释起来就是一个指向两个传输的函数指针。
我们可以定义一个 pf fun();他就返回的是函数指针了。
引用&
实际上引用能起到的作用,*很多时候也能够起到,那为什么我们还经常说,要尽量使用引用呢?最大的优点就是指针更安全。当然某些情况下例外。
引用可以认为是一个别名,而指针则是一个实体,虽然他们都有地址的概念在里面。
这里主要描述一下引用和指针的不同之处。
1、指针是可以重新指向另外一个对象,而引用不行,引用一旦绑定那就不能再绑定其他了,引用的这种性质有一点嫁鸡随鸡嫁狗随狗的意味在里面。这对男人是不是更安全呢?O(∩_∩)O哈哈~
2、指针可以是空指针,但是引用不能是空引用啊,所以引用都是必须初始化的。
3、指针是指向一个实体(程序为指针变量分配内存区域),而指针则是一个别名,这个可以怎么理解呢?我们通过sizeof(指针)和sizeof(引用)可以知道,前者是指针的大小,一般为4,而后者则是引用对象的大小,也就是说,如果对一个字符串长度为100的字符串进行引用sizeof是100哦,而指针还是4.
4、如果需要返回动态分配的对象或者内存,应该使用指针,引用很有可能引起内存泄露问题。
当然还有其他的一些不同,但是总体来说都是由以上衍生出来的。
其实引用本质上来说是一种指针,只不过编译器进行了优化(所以指针更加灵活),所以引用具有指针的特点,又更安全。