详谈C++引用&和指针在作为形参时的区别

针对“详谈C++引用&和指针在作为形参时的区别”这个话题,我们可以从以下几个方面来进行讲解:

  1. 引用&和指针的定义与基本概念
  2. 在作为函数参数传递时的区别
  3. 示例说明

1. 引用&和指针的定义与基本概念

在C++中,引用(&)和指针(*)都是用于间接访问内存的机制,它们之间也有许多相似的地方。具体的定义和概念如下:

引用&

引用是C++中一种特殊的数据类型,它是一个别名,可以对已经存在的变量进行引用。换言之,一个引用就是一个变量的别名,对引用的操作和对变量的操作效果是一样的,它们在内存中共享同一块地址。在定义时需要使用&符号,如下所示:

int a = 10;
int &b = a;

其中,a是一个整型变量,b是a的一个引用,相当于对a起个别名b。这里需要注意的是,引用在定义时必须初始化,而且只能初始化一次。

指针*

指针是C++中也是一种特殊的数据类型,它是一个变量,存储的是一个地址。通过指针我们可以直接操作内存中的数据。在定义时需要使用*符号,如下所示:

int a = 10;
int *p = &a;

其中,p是一个指向a的指针,在内存中存储的是a的地址。通过指针,我们可以直接访问和操作a的值。

2. 在作为函数参数传递时的区别

当引用和指针作为函数参数传递时,他们有着不同的特性和表现:

引用&作为函数参数

当将引用作为函数参数进行传递时,函数的形参将是原参数的一个别名,指向同一内存单元,在函数内可以直接对于原引用的变量进行修改,修改后的值将会影响到原来的变量。具体的示例代码如下所示:

#include <iostream>

using namespace std;

void swap(int &a, int &b)
{
    int temp = a;
    a = b;
    b = temp;
}

int main()
{
    int a = 10, b = 20;
    cout << "Before swap: a = " << a << ", b = " << b << endl;
    swap(a, b);
    cout << "After swap: a = " << a << ", b = " << b << endl;
    return 0;
}

在上述代码中,函数swap()的参数是两个整型引用a和b,当swap()函数被调用时,a和b将直接引用原始的变量,在函数内部直接进行交换,交换结果会反映到原始变量上,因此输出的结果也会相应改变。

指针*作为函数参数

当将指针作为函数参数进行传递时,指针存储的是地址,而函数接收的实际上是这个地址的副本,函数内部对于指针变量的修改不会影响到原始的变量。具体的示例代码如下所示:

#include <iostream>

using namespace std;

void swap(int *a, int *b)
{
    int temp = *a;
    *a = *b;
    *b = temp;
}

int main()
{
    int a = 10, b = 20;
    int *p1 = &a, *p2 = &b;
    cout << "Before swap: a = " << a << ", b = " << b << endl;
    swap(p1, p2);
    cout << "After swap: a = " << a << ", b = " << b << endl;
    return 0;
}

在上述代码中,函数swap()的参数是两个整型指针a和b,当swap()函数被调用时,函数内部将进行指针指向变量的交换,但是交换结果不会反映到原始变量的值上,故输出的结果并未改变。

3. 示例说明

我们用一个更具体的例子来说明引用和指针在作为函数参数传递时的区别:

#include <iostream>

using namespace std;

void modify(int &a, int *p) 
{
    a++;
    (*p)++;   // 括号要添加,避免错误
}

int main() 
{
    int x = 5;
    int *y = &x;
    cout << "Before modification: x = " << x << ", *y = " << *y << endl;
    modify(x, y);
    cout << "After modification: x = " << x << ", *y = " << *y << endl;
    return 0;
}

在上面的例子中,modify()函数接收一个int类型的引用a和一个int型的指针p,x的值为5,p指向的地址为x。modify()函数内部分别修改a和p指向的变量值,其中对于a的修改会直接修改原始变量的值,而对于p指向的变量修改则通过解引用指针(*p)进行修改,解引用后得到的是实际的变量值,无法直接影响原始变量。运行代码,输出结果如下所示:

Before modification: x = 5, *y = 5
After modification: x = 6, *y = 6

可以看到,对于引用的修改已经反映到了原始变量上,而对于指针所指向变量的修改不会直接反映到原始变量上,需要通过指针进行间接访问修改。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详谈C++引用&和指针在作为形参时的区别 - Python技术站

(0)
上一篇 2023年6月7日
下一篇 2023年6月7日

相关文章

  • 使用.NET命令行编译器编译项目(如ASP.NET、C#等)

    使用.NET命令行编译器(通常是csc.exe)可以编译各种.NET项目,包括ASP.NET和C#等。下面是完整的攻略过程。 安装.NET Core SDK 首先,你需要安装.NET Core SDK,因为.NET命令行编译器是其中的一部分。你可以在官方网站上下载适用于你的操作系统的版本。安装完成后,你可以使用以下命令来检查.NET命令行编译器是否已经安装成…

    C# 2023年5月14日
    00
  • dotnet如何将文件删除到回收站

    可以使用Microsoft.VisualBasic.FileIO命名空间下的FileSystem.DeleteFile方法实现文件删除到回收站的操作。以下是完整的攻略: 步骤一:添加引用 在项目中添加对Microsoft.VisualBasic的引用。 方法是在Visual Studio的解决方案资源管理器中选择项目,右键单击并选择“添加”->“引用”…

    C# 2023年6月7日
    00
  • Unity 修改FBX模型动画的操作

    下面是关于“Unity 修改FBX模型动画的操作”的完整攻略,具体内容如下: 1. 导入FBX模型和动画 在Unity的Assets面板中右键点击空白区域,选择Import New Asset,将FBX模型和动画导入到项目中。导入时要确保勾选了Import Animations选项,以便将动画一起导入进来。 2. 创建动画控制器(Controller) 选中…

    C# 2023年6月3日
    00
  • C# FTP操作类分享

    C# FTP操作类分享 在.NET开发中,FTP协议是常用的文件传输方式之一,C#语言也提供了FTP相关的操作类。本文将分享C#中如何操作FTP的实现方法,包括连接FTP服务器、上传文件、下载文件等操作,并附有两条示例说明。 连接FTP服务器 连接FTP服务器通常需要服务器地址、用户名和密码等信息,并使用FTP连接类FtpWebRequest进行连接,示例代…

    C# 2023年6月1日
    00
  • ASP.NET MVC API 接口验证的示例代码

    下面是关于“ASP.NET MVC API 接口验证的示例代码”的完整攻略: 一、背景介绍 ASP.NET MVC是一种基于MVC(Model-View-Controller,模型-视图-控制器)的开发模式来创造Web应用程序的思想。ASP.NET Core是一个跨平台的、高性能的框架,可以用于构建Web应用程序、RESTful API、微服务,等等。 二、…

    C# 2023年5月31日
    00
  • 如何用C#获取计算机详细的软件和硬件信息

    当使用C#语言编写桌面应用程序时,有时需要获取计算机的详细软硬件信息,例如操作系统、处理器、内存、硬盘、显卡、声卡等信息。本文将为您提供一份完整攻略,介绍如何使用C#获取计算机的诸多硬件和软件信息。 第一步:导入必要的命名空间 首先,我们需要使用以下命名空间来访问相关API: using System.Management; //用于WMI操作 using …

    C# 2023年6月6日
    00
  • C#客户端程序调用外部程序的3种实现方法

    当我们编写C#客户端程序时,有时需要调用外部程序来完成一些特定的任务,比如调用命令行程序、调用其他的应用程序等等。本文将会介绍C#客户端程序调用外部程序的3种实现方法。 方法一:使用Process类调用外部程序 C#提供了Process类来调用系统中的外部程序。Process类中提供了Start方法,可以启动外部程序,并且启动的程序可以接受参数,下面是示例代…

    C# 2023年5月15日
    00
  • C#中把FastReport.Net报表控件的数据保存到数据库

    C#中把FastReport.Net报表控件的数据保存到数据库的完整攻略如下: 1.准备工作 在开始保存FastReport报表控件的数据之前,需要先做一些准备工作,包括: 安装FastReport.Net报表控件; 在你的项目中引用FastReport.Net的dll文件; 在你的项目中引用数据库连接的相关dll文件; 创建一个数据库表,用来存储报表数据;…

    C# 2023年5月31日
    00
合作推广
合作推广
分享本页
返回顶部