犹记大一时期,搞ACM的小哥告诉我,其实学C++很简单,搞清了指针的东西,C++就入门了。的确,指针在C++中发挥着重要的作用,这几天项目需要,使用C++,故重温指针相关知识,笔记如下:
1.函数指针
函数指针本身是一个指针,其指向的是函数。
函数指针的格式如下,通用格式就不说了,直接上例子:
int (*f) (int ,int){}
在上面的例子中,*f 由于有括号的原因,因此成为一个指针f,这里使用的是C++的优先级来判断的。指针 f 指向一个函数,上例中函数接收两个int型的参数,函数名前面的int表示函数返回值。因此,可以解释为定义了一个指针f,它指向一个有两个int类型参数的返回int类型数据的函数。
相信仔细看过指针相关知识的都知道,对于一个数组来说,数组名就是指向数组第一个元素的常量指针,例如有int型数组A,那么访问A[0]也可以使用*A,那么访问A[3]也可以使用*(A+3)。同理,对于一个函数来说,函数名也是指向函数第一条指令的常量指针。对于函数来说,编译器要做的就是在程序编译以后,为每个函数分配一个首地址,即函数第一条指令的地址,所以可以使用指针保存这个首地址,那么就可以找到这个函数,而保存这个首地址的指针就是函数指针。对于数组A来说,如果将A看做是指针的话,那么A中存的地址就是数组A的第0个单元的地址即首地址;那么对函数来说也一样,对于一个函数如:int M(int a,int b){} ,那么可以使用函数名M来访问函数的首地址,这样,对于函数指针也就简单多了,对于上述的例子来说:函数指针是f,普通函数M,可以这样赋值:
f = M;
实例如下:
#include <iostream>
using namespace std;
int getAdd(int a, int b)
{
return a + b;
}
int getSub(int a, int b)
{
return a - b;
}
int(*f) (int, int); //定义函数指针
int main()
{
f = getAdd; //让函数指针f指向函数getAdd,即将getAdd的函数首地址赋给指针f
int add = (*f)(1, 2); //使用函数指针调用函数
cout << "两者之和是:" << add << endl;
f = getSub;
int sub = (*f)(1, 2);
cout << "两者之差是:" << sub << endl;
return 0;
}
运行结果如下:
两者之和是:3
两者之差是:-1
请按任意键继续. . .
使用函数指针需要注意的是:在给函数指针赋值时,函数和函数指针的返回值,参数个数和参数类型应该是一致的,否则会报错,如上例中,函数指针f的参数是两个int型,返回值也是int型,那么我们赋给f的函数getAdd和getSub的参数也是两个int型,且返回值也是int型。另外注意赋值,只是使用的函数名,没有带参数。
2.指针函数
指针函数本身是一个函数,其返回值是某个类型的指针,也就是说指针函数是一个返回地址值的函数。指针函数必须赋给指针变量。
指针函数格式如下,通用格式就不说了,直接上例子:
int *f (int a, int b) {}
在上面的例子中,f是指针函数的函数名,f前的 int * 表示其返回值是int 类型的指针,也就是返回一个地址,这个地址指向的内容的类型为int型。括号中的a和b是函数的参数。
实例如下:
#include <iostream>
using namespace std;
int *f(int a, int b);
int main()
{
int *p1 = nullptr;
cout << "p1中的地址是:" << p1 << endl;
p1 = f(1, 2); //调用指针函数
cout << "p1中的地址是:" << p1 << endl;
cout << "*p1=" << *p1 << endl;
return 0;
}
int *f(int a, int b)
{
int n = a + b;
int *p = (int *)malloc(sizeof(int)); //使用指针时要进行内存的申请和分配,否则不能为指针赋值
memset(p, 0, sizeof(int));
*p = n;
cout << "n=" << n << endl;
cout << "*p=" << *p << endl;
cout << "p中存的地址是:" << p << endl;
return p;
}
上面的例子的运行结果如下:
p1中的地址是:00000000
n=3
*p=3
p中存的地址是:00B0AD30
p1中的地址是:00B0AD30
*p1=3
请按任意键继续. . .
指针函数的函数 从上面的结果可以看到,p和p1的地址是相同的,那么可以看出指针函数返回的确实是地址。
以上就是函数指针和指针函数比较基础的知识,可能难理解,但真正看下来收货会很多。此外,推荐几篇比较好的博文,写的很详细:
http://www.cnblogs.com/uniqueliu/archive/2011/07/27/2118619.html
http://blog.csdn.net/ameyume/article/details/8220832
本人经验,仅供参考!