c++指针与函数

注:部分来源于网络相关资料,用于个人总结学习记录,如有侵权,请联删。

参考链接:https://blog.csdn.net/u010280075/article/details/88914424

1、指针作为函数的参数

指针最重要的应用是作为函数参数,它使得被调函数除了返回值之外,能够将更多的运算结果返回到主调函数中。指针是函数参数传递的重要工具

函数形参可以是指针类型,一般形式为:

通过指针作为函数参数的方法,既可以返回多个运算结果,又避免了使用全局变量

举例:

计算a和b的平方、自然对数和、几何平均数、和的平方根

2、数组作为函数的参数

(1)数组作为参数的形参

函数调用形式如下:

3、引用概念和规则

简单地说,引用就是一个对象的别名,声明形式为:

在c++中,引用全部都是const类型,声明之后不可更改,即不能再是别的对象的引用

引用的规则:

(1)声明一个引用类型变量时,必须同时初始化它,声明他是哪个对象的别名,即绑定对象,例如:

(2)不能有空引用,引用必须与有效对象的内存单元关联

(3)引用一旦被初始化,就不能改变引用关系,不能再作为其他对象的引用,例如:

(4)指定类型的引用不能初始化到其他了类型的对象上,例如:

(5)引用初始化与对引用赋值含义完全不同,例如:

(6)取一个引用的地址和取一个对象的地址完全一样,都是用取地址运算符&。例如:

4、引用作为函数形参

c++之所以扩充引用类型,主要是把它作为函数形参,使得c++中给一个函数传递参数有三种方法:

(1)传递对象本身

(2)传递指向对象的指针

(3)传递对象的引用

三种方法的比较:

使用引用作为函数形参,比使用指针变量简单、直观、方便,特别是避免了在被调函数中出现大量指针间接访问的情况。

5、引用作为函数返回值

函数的返回值可以是引用类型,即函数返回引用,其定义形式为:

函数返回值是一个指针:

函数返回引用:

可以看出,函数返回引用与函数返回值有重大区别,它不是返回一个临时对象,而是相当于返回实体对象本身。正因为如此,函数返回引用可以作为左值。例如:

int &fun(int &a,int &b )
{
        return (a>b?a:b);
}

int main()
{
        int x = 10, y=20,z=5;
        fun(x,y) = z;
        cout << y << endl;                                                                           
}

执行结果:

5

6、指向函数的指针

函数是实现特定功能的程序代码的集合,实际上,函数代码在内存中也要占据一段内存空间(代码区内),这段存储空间的起始地址称为函数入口地址。c++规定函数入口地址为函数的指针,即函数名既代表函数,也是函数的指针(或者地址)。

c++允许定义指向函数的指针变量,定义形式为:

它可以指向如下形式的函数:

函数指针如何指向函数:

可以将函数的地址赋值给函数指针变量,形式为:

函数指针变量 = 函数名;

要求函数指针变量与指向函数必须有相同的返回类型,参数个数,参数类型。

例如假如:

若p = max;则称p指向函数max。它也可以指向函数min,即可以指向所有与它有相同的返回类型、参数个数、参数类型的函数。

7、函数指针调用函数和回调函数

对函数指针间接引用即是通过函数指针调用函数,一般形式为:

函数指针(实参列表)

通过函数指针调用函数,在实参、参数传递、返回值等方面与函数名调用相同,例如:

指针函数用途:

指向函数的指针多用于指向不同的函数,从而可以利用指针变量调用不同函数,相当于将函数调用由静态方式(固定地调用指定函数)变为动态方式(调用那个函数是由指针值来确定)。熟练掌握函数指针的应用,有利于程序的模块化设计,提高程序的可扩展性。

举例:

回调函数

#include<stdio.h>
#include<stdlib.h>

//函数功能:实现累加求和
int func_sum(int n)
{
        int sum = 0;
        if (n < 0)
        {
                printf("n must be > 0\n");
                exit(-1);
        }
        for (int i = 0; i < n; i++)
        {
                sum += i;
        }
        return sum;
}

//这个函数是回调函数,其中第二个参数为一个函数指针,通过该函数指针来调用求和函数,并把结果返回给主调函数
int callback(int n, int (*p)(int))
{
        return p(n);
}

int main(void)
{
        int n = 0;
        printf("please input number:");
        scanf("%d", &n);
        printf("the sum from 0 to %d is %d\n", n, callback(n, func_sum));       //此处直接调用回调函数,而不是直接调用func_sum函数
        return 0;
}

在这个程序中,回调函数callback无需关心func_sum是怎么实现的,只需要去调用即可。

这样的好处就是,如果以后对求和函数有优化,比如新写了个func_sum2函数的实现,我们只需要在调用回调函数的地方将函数指针指向func_sum2即可,而无需去修改callback函数内部。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值