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

news2024/9/21 14:53:27

指针和引用的概念及区别

引用

  • 引用是一个已存在对象的别名,使用 & 符号进行声明,例如 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() 函数。通过函数返回的指针,我们可以获取较大的值,并进行输出。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/733324.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot开启定时任务

有些场景需要使用到定时任务&#xff0c;比如&#xff1a; 定时数据备份&#xff1a;定时任务可以用于自动备份数据库或重要文件。可以编写一个定时任务来定期执行数据备份操作&#xff0c;以保护数据的安全性。 定时数据同步&#xff1a;在分布式系统中&#xff0c;定时任务可…

mac远程连接windows10-Microsoft Remote Desktop

主要碰到的坑&#xff1a; windows上没有开启远程桌面连接&#xff0c;导致Microsoft Remote Desktop连接的时候老报错。 开始菜单-》设置-〉远程桌面 如果还不行就看一下服务&#xff1a; 右键我的电脑-》管理 -〉服务 打开远程桌面服务&#xff08;最好设置成自动启动&…

CygWin:windows上运行类linux命令

CygWin是一个在Windows平台上运行的类UNIX模拟环境&#xff0c;是Cygnus Solutions公司开发的自由软件。它提供了类似于Linux系统的终端环境和工具&#xff0c;使用户可以在Windows平台上运行Unix-like的程序&#xff0c;如Bash、awk、sed和grep等 。 下载setup.exe 安装Cygwin…

初阶C语言———操作符详解(2)

hello&#xff0c;我们又见面了&#xff0c;今天我们把操作符这一章节完结&#xff0c;那让我们一起来学习吧 逻辑操作符 &&逻辑与 ||逻辑或 这里我们要区分按位与和按位或还有逻辑与和逻辑或的区分。 1&2----->0 1&&2---->1 1|2----->3 1||2---…

Day46|139.单词拆分 、多重背包理论基础、背包问题总结

139.单词拆分 1.题目&#xff1a; 给你一个字符串 s 和一个字符串列表 wordDict 作为字典。请你判断是否可以利用字典中出现的单词拼接出 s 。 注意&#xff1a;不要求字典中出现的单词全部都使用&#xff0c;并且字典中的单词可以重复使用。 示例 1&#xff1a; 输入: s …

TiDB 7.1 资源管控验证测试

作者&#xff1a; dba-kit 原文来源&#xff1a; https://tidb.net/blog/9cd7dcb3 〇、背景 我们线上使用环境和李文杰大佬比较类似&#xff0c;我这里就不赘述了&#xff0c;大家可以看 专栏 - TiDB v7.1.0 跨业务系统多租户解决方案 | TiDB 社区 &#xff0c;这里比较清…

PyQt---------PyQt组件的学习

1.QLabel组件 QLabel用于显示文本或图像&#xff0c;不提供用户交互功能&#xff0c;标签的视觉外观可以以各种方式配置。 举个例子吧 import sys from PyQt6.QtCore import Qt from PyQt6.QtWidgets import QApplication, QLabel, QMainWindowclass MainWindow(QMainWindow…

大厂C++题第1辑——虚函数七题精讲之2:虚函数的作用机制

一、虚函数的常见应用场景&#xff1b; 二、发挥虚函数作用的语法&#xff1b; 三、虚函数的实现机制&#xff1b; 四、虚函数的性能影响。 题2-虚函数的常见应用场景 上一节我们讲了虚函数的作用&#xff0c;同时也演示了虚函数发挥作用的路径之一&#xff1a; 一个派生类对…

Docker 私有仓库 harbor 搭建

&#x1f388; 作者&#xff1a;Linux猿 &#x1f388; 简介&#xff1a;CSDN博客专家&#x1f3c6;&#xff0c;华为云享专家&#x1f3c6;&#xff0c;Linux、C/C、云计算、物联网、面试、刷题、算法尽管咨询我&#xff0c;关注我&#xff0c;有问题私聊&#xff01; &…

Vue操作Cookie

这里用的js-cookie。 很简单&#xff0c;安装一下就可以使用了。 npm install js-cookie --save 使用示例&#xff1a; import Cookies from js-cookieexport default {name: YourComponent,methods: {setCookie() {// 设置一个名为 name 的cookie&#xff0c;值为 value&a…

聚焦信息技术发展,博睿数据受邀出席产业链供需对接深度行北京站活动

7月6日&#xff0c;以“广聚群链 湾区启航”为主题的产业链供需对接深度行北京站活动圆满落幕。本次活动吸引了来自北京和广东的多家知名企业参与&#xff0c;博睿数据受邀出席了本次活动&#xff0c;同时携核心产品一体化智能可观测平台Bonree ONE参展&#xff0c;展示博睿数据…

Nginx配置springboot+vue项目http跳转https

java生成证书 添加依赖 <dependency><groupId>org.bouncycastle</groupId><artifactId>bcpkix-jdk15on</artifactId><version>1.69</version></dependency> import org.bouncycastle.asn1.ASN1Encodable; import org.bounc…

易微联2.4G通断器添加到手机步骤

蓝牙款无WIFI&#xff0c;按住通断器上的按钮&#xff0c;会先闪一下&#xff0c;再闪两下。闪一下的时候连手机&#xff0c;闪两下清码。 手机上打开易微联app&#xff0c;依次点击加号/轻智能遥控器/单按键遥控器/添加完成。 返回打开刚才添加的开关&#xff0c;在通断器闪…

基于Spring Boot的医院信息管理系统设计与实现(Java+spring boot+MySQL)

获取源码或者论文请私信博主 演示视频&#xff1a; 基于Spring Boot的医院信息管理系统设计与实现 使用技术&#xff1a; 前端&#xff1a;html css javascript jQuery ajax thymeleaf 后端&#xff1a;Java springboot框架 mybatis 数据库&#xff1a;mysql5.7 开发工具:IDEA…

Apollo星火计划城市交通大赛600分,断头路,特殊车辆绕行,借道绕行

现在解决了前六题&#xff0c;可以拿到600分&#xff0c;有兴趣一起讨论的可以私聊我交流一下。

Linux命令(41)之top

Linux命令之top 1.top介绍 linux命令top是用来实时监测服务器资源的使用状况&#xff0c;包含进程、cpu、内存等等 2.top用法 top [参数] top常用参数 参数说明-d屏幕刷新时间间隔-i<time>设置刷新时间间隔-u<user>指定用户名-p<pid>指定进程号 top命令中…

Android平台GB28181设备接入技术探讨

GB/T28181技术背景 在此之前&#xff0c;我们先对协议规范做个简单了解&#xff1a;GB28181协议是一种用于视频监控系统互联互通的国际标准&#xff0c;它定义了视频监控系统中的设备间如何进行通信、交换数据和协调控制。以下是GB28181协议的一些主要内容&#xff1a; 设备互…

有哪些数据结构与算法是程序员必须要掌握的?——“数据结构与算法”

一&#xff1a;引言 作为IT程序员&#xff0c;学习算法的原因主要有以下几点&#xff1a; 提升问题解决能力&#xff1a;算法可以帮助程序员分析、优化和解决复杂问题。了解算法原理和实现方式将有助于程序员更快地找到合适的解决方案。这对于解决实际工作中的问题是非常有帮助…

基于STM32FFT(快速傅里叶变换)音频频谱显示功能实现

+ v hezkz17进数字音频系统研究开发交流答疑 一实验效果 二 设计过程 要用C语言实现STM32频谱显示功能,可以按照以下步骤进行操作: 1 确保已经安装好了适当的开发环境和工具链,例如Keil MDK或者GCC工具链。 2 创建一个新的STM32项目,并选择适合的MCU型号。 3 配置G…

es8.8 集群安装笔记

es8.8 集群安装笔记 配置集群第一步 修改配置文件 本次安装使用centos8 3节点安装&#xff1a; 192.168.182.142 192.168.182.143 192.168.182.144 官网 可以查看详细的安装&#xff0c;安装步骤比较简单 https://www.elastic.co/guide/en/elasticsearch/reference/8.8/rpm.htm…