【C++】引用、指针、函数指针、指针函数

指针和引用的概念及区别

引用

  • 引用是一个已存在对象的别名,使用 & 符号进行声明,例如 int& ref = num;
  • 引用必须在声明时初始化,并且一旦绑定到一个对象后,就不能再重新绑定到其他对象
  • 引用使用起来类似于被引用对象的别名,通过引用可以直接访问和操作所引用的对象。
  • 引用不占用额外的内存空间,它只是对已存在对象的一个别名。

指针

  • 指针是一个变量,存储了内存地址,使用 * 符号进行声明,例如 int* ptr;
  • 指针可以通过赋值操作指向其他变量或对象,也可以指向空地址(nullptr)表示没有指向任何对象。
  • 指针可以进行指针运算,例如指针加法、指针减法等,以及访问所指向对象的成员。
  • 指针需要显式地进行解引用操作(使用 *)才能访问所指向对象的值。

在这里插入图片描述
总结来说,引用提供了一种直接访问已存在对象的方式,而指针提供了更灵活的内存管理和间接访问对象的方式。引用在声明时必须初始化,并且一旦绑定到一个对象后不能更改目标对象,而指针可以重新赋值指向不同的对象。根据具体的使用场景和需求,选择适合的引用或指针来处理变量和对象。

函数指针

指针变量也可以指向一个函数。一个函数在编译时被分配给一个入口地址。这个函数入口地址就称为函数的指针。可以用一个指针变量指向函数,然后通过该指针变量调用此函数。
函数指针的一般形式定义为:

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

示例:

#include<iostream>
using namespace std;
int mymax(int x, int y)
{
	return (x > y) ? x : y;
}
int main()
{
	int a, b, c;
	cin >> a >> b;
	c = mymax(a, b);
	cout << "mymax(a,b)=" << c << endl;
	int(*p)(int, int);
	p = mymax;
	cout << "p(a,b)=" << p(a, b) << endl;
	return 0;
}

定义了两数比较返回较大值的函数mymax。正常调用为mymax(a, b)
指针调用方法如下:
首先定义指针变量int(*p)(int, int)
第一个int表示指针变量p指向的函数的类型,后两个int是指p所指向的函数中的形参的类型。p是指向函数的指针变量。

注意: 在定义指向函数的指针变量p时,(*p)两侧的括号不可省略,表示 p先于*结合,它是指针变量,然后再与后面的()结合,表示此指针变量指向函数。
p=mymax是将函数max的入口地址赋给指针变量p,这样p才指向函数max。

指针函数

一个函数可以带回一个整型值、字符值、实型值等,也可以带回指针型的数据,即地址。其概念与以前类似,只是带回的值的类型是指针类型而已。返回指针值的函数简称指针函数。
定义指针函数的一般形式为:

类型名 *函数名(参数列表)

例如:

int *a(int x,int y);

a是函数名,调用它以后能得到一个指向整型数据的指针(地址)。

注意: a两侧没有括号,由于()优先级高于,因此a先与()结合,显然这是函数形式。

示例:

#include <iostream>

// 定义一个指针函数,返回两个整数中较大的值的指针
int* GetMax(int* num1, int* num2) {
    if (*num1 > *num2) {
        return num1;
    } else {
        return num2;
    }
}

int main() {
    int a = 5;
    int b = 10;

    // 调用指针函数,获取较大值的指针
    int* maxPtr = GetMax(&a, &b);

    std::cout << "Max value: " << *maxPtr << std::endl;

    return 0;
}

在上述示例中,GetMax() 函数是一个指针函数,它接受两个整数的指针作为参数,并返回较大值的指针。在 main() 函数中,我们将变量 a 和 b 的地址传递给 GetMax() 函数,并将返回的指针存储在 maxPtr 中。然后,通过解引用 maxPtr,我们可以获取较大值并进行输出。

引用的实现方式:

#include <iostream>


int* GetMax(int &num1, int &num2) {
	if (num1 > num2) {
		return &num1;
	}
	else {
		return &num2;
	}
}

int main() {
	int a = 5;
	int b = 10;
	int* maxPtr = GetMax(a, b);
	std::cout << "Max value: " << *maxPtr << std::endl;
	return 0;
}

当我们将参数声明为引用类型(使用 & 符号)时,函数可以直接访问并操作函数外部的变量,而无需通过指针的间接方式。

在这个例子中,GetMax() 函数接受两个参数 num1 和 num2,这两个参数都是以引用的方式传递。通过引用参数,函数内部可以直接访问和比较 num1 和 num2 的值。

在函数内部,通过比较 num1 和 num2 的值,找到较大的值,并返回该值的指针。由于函数参数是以引用方式传递的,所以函数内部对参数的修改会直接反映到函数外部的变量上。

在 main() 函数中,我们定义了变量 a 和 b,并将它们的值传递给 GetMax() 函数。通过函数返回的指针,我们可以获取较大的值,并进行输出。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

嘿♚

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值