引用和指向函数的指针

本文详细介绍了C++中的引用概念,包括引用作为函数参数的优点、引用的规则以及引用与指针的区别。此外,还探讨了函数返回引用的特性,并举例说明了如何通过函数指针调用函数,强调了函数指针在动态调用函数和模块化设计中的作用。
摘要由CSDN通过智能技术生成

引用

通过对象名称直接访问对象,优点是直观,操作哪个对象一目了然,缺点是一个函数内部不能使用另一个函数的局部变量。

通过指针(或地址)间接访问对象,优点是无所不能,缺点是程序中大量出现的间接访问,是在分不清具体是哪个对象,需要通过上下文去分析。

C++扩充了C语言对象访问方式,提供了引用访问。通过引用访问对象,结合了按名访问和按地址访问各自的优点,非常适合作为函数参数

1.引用作为函数参数
简单来说,引用(reference)就是一个对象的别名,其声明形式为:
引用类型 &引用名称=对象名称

int x;//定义整形变量x
int &r=x;//声明r是x的引用

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

引用的规则

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

int &r;//错误,引用是const类型,必须在声明时就初始化
int x,&r=x;//正确,r是x的引用

2)不能有空引用,引用必须与有效对象的内存单元关联。
3)引用一旦被初始化,就不能改变引用关系,不能再作为其他对象的引用。例:

int x,y;
int &r=x;
int &r=y;//错误

4)指定类型的引用不能初始化到其他类型的引用上。
5)引用初始化与对引用赋值是完全不同的概念,例:

int x;//定义整形变量x
int &r=x;//初始化 指明r是x的引用,即将r绑定到x
r=100;//引用赋值, 100赋值到r绑定的内存单元中(即x)

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

int x,&r=x;//定义整形变量x,y
int *p1=&x;//p1指向x
int *p2=&r;//p2指向r,本质上指向x

引用作为函数形参

C++之所以扩充引用类型,主要是把它作为函数形参,使得C++中给一个函数传递参数有三种办法:
1)传递对象本身;
2)传递指向对象的指针;
3)传递对象的引用;
例:

#include<bits/stdc++.h>
using namespace std;
//1传递对象本身 
void swap(int a,int b)
{
	int t;
	t=a;
	a=b;
	b=t;
 } 
 int main()
 {
 	int x=10,y=20;
 	swap(x,y);
 	cout<<x<<" "<<y;
 	return 0;
 }
 运行结果:10 20
 a和x,b和y,都是不同的变量
 即xy的值并没有发生交换

例2

#include<bits/stdc++.h>
using namespace std;
//2传递对象的指针 
void swap(int *a,int *b)
{
	int t;
	t=*a;
	*a=*b;
	*b=t;
 } 
 int main()
 {
 	int x=10,y=20;
 	swap(&x,&y);
 	cout<<x<<" "<<y;
 	return 0;
 }
 运行结果:20 10

例3:

#include<bits/stdc++.h>
using namespace std;
//2传递对象的引用 
void swap(int &a,int &b)
{//引用作为函数形参 
	int t;
	t=a;
	a=b;
	b=t;
 } 
 int main()
 {
 	int x=10,y=20;
 	swap(x,y);
 	cout<<x<<" "<<y;
 	return 0;
 }

使用引用作为函数形参,比使用指针变量简单、直观、方便,特别是避免了在被调函数中出现大量指针间接访问时,所指对象究竟是哪个具体对象伤脑筋的问题,从而降低了编程的难度。

引用作为函数返回值

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

引用类型& 函数名(形参)
{函数体}

例1:

//函数返回数值
#include<bits/stdc++.h>
using namespace std;
int max(int a,int b)
{
	return (a>b?a:b);
} 
int main()
{
	int x=10,y=20,z;
	z=max(x,y);
	cout<<z;
	return 0;
}

例2

//函数返回指针
#include<bits/stdc++.h>
using namespace std;
int* max(int a,int b)
{
	return (a>b?&a:&b);
} 
int main()
{
	int x=10,y=20,*z;
	z=max(x,y);
	cout<<*z;
	return 0;
}

例3

//函数返回引用
#include<bits/stdc++.h>
using namespace std;
int& max(int &a,int &b)
{
	return (a>b?a:b);
} 
int main()
{
	int x=10,y=20,z;
	z=max(x,y);
	cout<<z;
	return 0;
}

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

int& fun(int &a,int &b)
{return (a>b?a:b);}
int x=10,y=20,z=5;
fun(x,y)=z;//调用fun函数后相当于y=z
cout<<y;

指向函数的指针

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

C++允许定义指向函数的指针变量,定义形式为:
*返回类型(函数指针变量名)(形式参数列表)

int (*p)(int a,int b);//定义函数指针变量

使函数指针指向函数
可以将函数的地址赋给函数指针变量,形式为:
函数指针变量=函数名;

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

int max(int a,int b);//max函数原型
int min(int a,int b);//min函数原型
int (*p)(int a,int b);//定义函数指针变量


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

通过函数指针调用函数
对函数指针间接引用即是通过函数指针调用函数,一般形式为:
函数指针(实参列表)
通过函数指针调用函数,在实参、参数传递、返回值等方面与函数名调用相同。
例如:

c=p(a,b);//等价于c=max(a,b)

函数指针的用途

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值