指针在数组中的作用前面已经介绍过了,但是指针在函数中如何兴风作浪并没有提到,因此在这里,会对指针在函数中的作用进行阐述。特别是在函数传参方面的应用,最简单的或许也是我们目前见的最多的就是值传递的方式,当一个实参进入到函数中后,进行动作的是实参的一个分身,这个分身你可以对他进行值改变等操作,但是呢不会影响到函数体外实参的值大小。
但是指针传参的时候,指针变量会产生一个分身,这个分身和原来的指针变量一样,指向的内存区域是相同的,一旦分身的指向改变了,那么原来指针变量的指向也会跟着改变。我们继续从例子来看:
#include<iostream>
using namespace std;
void test1(int a,int b)
{
int temp;
temp = a;
a = b;
b = temp;
cout <<"在函数体内部实现交换的结果是: "<< "a=" << a << " " << "b=" << b << endl;
}
void test2(int *a,int *b)
{
int temp;
temp = *a;
*a = *b;
*b = temp;
cout << "在函数体内部实现交换的结果是: " << "a=" << *a << " " << "b=" << *b << endl;
}
void main()
{
int p, q;
int* xp, * xq;
cout << "输入两个数" << endl;
cin >> p;
cin >> q;
xp = &p;
xq = &q;
cout << "调用test1,值传递方式得到的结果:" << endl;
test1(p,q);
cout << "在函数体外部实参的结果是:" << endl;
cout << "p=" << p << endl;
cout << "q=" << q << endl;
cout << "调用test2,指针传递方式得到的结果:" << endl;
test2(xp, xq);
cout << "在函数体外部实参的结果是:" << endl;
cout << "p=" << p << endl;
cout << "q=" << q << endl;
}
上面的这个代码是对值传参和指针传参进行了对比,函数test1()是通过值传递的方式来对形参进行数值的交换,函数test2()是通过指针传参的方式来对形参进行交换,交换的结果如下图。
根据结果可以看出来,两个函数在自己的函数体内都实现了对两个形参的交换,但是通过指针传参的方式是通过改变指针的指向从而交换数据,因此实参的数值也会对应的交换。
还有就是指向函数的指针,我们常见的函数通常返回值为空、字符型、整型、实型等,其实还可以返回一个地址,也就是返回一个指针类型,这样的函数就是指针函数。有指针函数,对应的有函数指针,当一个函数在编译时被分配了一个入口地址,这个函数入口地址就是函数的指针。
我们可以从浅入深的来搞明白这两个的关系。首先来看一个例子。
int sum(int a, int b);
这个函数是很好理解的,一个普通的带着两个参数的返回值为int的函数。
那么再看一下下面的函数。
int* sum(int a, int b);
一般使用起来是这样的:
#include <iostream>
using namespace std;
int x = 1, y = 1;
int* p;
int* sum(int a, int b)
{
int c;
c = a + b;
return &c;
}
void main()
{
p = sum(x, y);
cout << p << endl;
}
指针函数中,函数名前多了一个*,这就表示了一个返回值为int型指针的函数,既然是指针,就说明返回值是一个地址,这点应该是比较简单的,这就是一个指针函数。一般来说,我们在使用指针函数的时候,需要提供一个同类型的指针来接收对应指针函数的返回值。当然,我们也可以定义一个void类型的指针函数,在接收其 返回值的时候将其强制转换成所需要的类型,但是这种方法不做推荐。
再来看函数指针,函数指针是一个指向函数的指针变量,要记住,函数指针的本质是一个指针,指针函数的本质是一个函数,这种文字顺序不一样,意思也不一样,我们不要被迷惑了。下面是一个函数指针:
int (*fun)(int , int );
函数指针是针对于函数的,需要对其赋值一个函数的地址。具体的赋值方法如下:
int (*fun)(int, int);
int sub(int a, int b)
{
return a - b;
}
void main()
{
fun = sub; //第一种赋值方式
fun = ⊂ //第二组赋值方式
}
统一起来举个例子:
#include <iostream>
using namespace std;
int x = 1, y = 1;
int* p;
int (*fun)(int, int); //函数指针
int* sum(int a, int b) //指针函数
{
int c;
c = a + b;
return &c; //返回c的地址
}
int sub(int a, int b) //一般函数
{
return a - b;
}
void main()
{
p = sum(x, y);
cout << p << endl;
fun = sub;
fun = ⊂
cout << "两个数相减(*fun)(a,b)的结果是:" << (*fun)(5, 3) << endl;
}
运行结果如图:
通过上面的例子我们对指针函数和函数指针的区别应该有了一个认识,可以从其本质、写法和用法三个方面对其进行区分。
本质
指针函数本质是一个函数,返回地址,即指针;
函数指针本质是一个指针,指向函数。
写法
写法可见上面的叙述,简单粗暴一点,指针函数不带括号,函数指针带括号
用法
用法的话可以参考上面的函数讲解,可以自己敲一下试试,加深体会。
希望自己的讲解对大家有所帮助,避免走弯路!如有不正之处,希望各路大神不吝赐教!