指针用作函数参数、指针型函数和函数指针

指针用作函数参数

以前我们学过的函数参数要么是基本数据类型的变量,要么是类的对象,又或者是数组名,前几讲学到的指针同样可以用作函数参数。

指针作函数形参时,我们调用此函数将实参值传递给形参后,实参和形参指针变量将指向相同的内存地址,那么在被调函数中对形参指针所指向的对象的改变会一样影响主调函数中实参指针指向的对象。

指针用作函数参数用什么作用呢?

其一,使形参指针和实参指针指向相同的内存地址,在被调函数中可以使用主调函数中的数据并可以改变主调函数中的数据,达到数据双向传递的效果。当然,前面讲过的引用也可以实现相同的作用。

其二,用指针作函数参数传递数据可以减少参数传递的开销,引用当然也可以实现这些。

其三,可以通过指向函数的指针来传递函数代码的首地址。

指针和引用很多时候作用是一样的,引用相对指针来说可读性更好,但有时还是需要使用指针。

把之前讲引用调用时的例程给大家修改下说明指针怎样用作函数参数:

#include<iostream>
using namespace std;
void Swap(int *a, int *b);
int main()
{
    int x=5, y=10;
    cout<<"x="<<x<<"    y="<<y<<endl;
    Swap(&x, &y);
    cout<<"x="<<x<<"    y="<<y<<endl;
    return 0;
}
void Swap(int *a, int *b)
{
    int t;
    t=*a;
    *a=*b;
    *b=t;
}

在这里插入图片描述
这里的Swap函数使用了指针作为参数,我们在调用时传入的是x和y的地址,分别传递给了a和b,然后在Swap内部改变了a和b指向的变量的值,而实际上它们指向的就是x和y,所以x和y的值发生了同样的改变。

指针型函数

函数都有自己的类型,除void类型的函数外都有自己的返回值。函数的返回值也可以是指针。返回值为指针类型的函数就是指针型函数。

普通函数只能返回一个变量或对象,但指针型的函数可以在函数调用结束时将大量数据从被调函数返回到主调函数中,这就是它的好处。

注意不要返回局部变量的地址,因为出了被调函数局部变量就释放了,返回的地址中存放的内容也是无效的了。

声明指针型函数的语法形式是:

数据类型 *函数名(参数表)
{
    函数体
}

数据类型指明了函数返回的指针的类型,“*”和函数名说明这是一个指针型函数,参数表是函数的形参列表。

函数指针

我们知道,程序运行时,数据会占用内存空间,实际上程序执行时代码也会调入内存,也会占用内存空间。函数名就是函数代码占用内存空间的首地址。函数指针就是用于存放函数代码首地址的变量。

我们也可以使用函数指针来调用函数,它和函数名实现的作用是一样的。声明方式也类似,也需要指明函数的返回值、形参列表,声明的语法形式是:

数据类型 (*函数指针名)(形参列表);

数据类型指明了函数指针所指向函数的返回值类型,函数指针名给出函数指针的名称,形参列表则说明了函数指针所指函数的形参类型和形参个数。

函数指针和一般的指针一样也要在使用之前先赋值,让它指向一个函数代码的首地址。为函数指针赋值的语法形式是:

函数指针名 = 函数名;

被指向的函数需要是声明过的已存在的,和函数指针必须具有相同的返回值类型、形参个数和形参类型。给函数指针赋值之后我们就可以通过函数指针名来调用它指向的函数了。

给大家一个函数指针的简单程序的例子:

#include <iostream>
using namespace std;

void show(int x)
{
    cout << x << endl;
}

void (*show_pointer)(int);    // 声明一个void类型的函数指针

int main()
{
    int a = 10;
    show_pointer = show;    // 函数指针show_pointer指向show
    show_pointer(a);        // 函数指针调用
    return 0;
}

在这里插入图片描述
上面例子中声明了一个void类型的函数指针:void (*show_pointer)(int);。我们通过给此函数指针赋值让其指向void类型的函数show,然后用函数指针实现了对函数的调用,输出了a的值。程序运行结果是:10。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阳光开朗男孩

你的鼓励是我最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值