详谈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日

相关文章

  • 一步步打造简单的MVC电商网站BooksStore(1)

    我来为您讲解一下“一步步打造简单的MVC电商网站BooksStore(1)”的完整攻略。 概述 本文主要是为了介绍如何使用PHP语言和MVC架构模式搭建一个简单的电商网站BooksStore。通过本文,您将会了解到如何设计和实现一个基于MVC架构的网站,并且了解到如何通过简单的代码实现用户登录、商品浏览、商品购买等功能。 MVC架构模式 MVC是一种软件架构…

    C# 2023年5月31日
    00
  • C#数据表格(DataGridView)控件的应用案例

    下面我来详细讲解“C# 数据表格(DataGridView)控件的应用案例”的完整攻略,包含两条示例说明。 简介 DataGridView 控件是 C# Windows 窗体应用程序中常用的控件之一,它可以用于展示和编辑数据。在本文中,将会有两个具体的示例,演示如何使用 DataGridView 控件。 示例1:DataGridView 显示数据库表格数据 …

    C# 2023年6月1日
    00
  • C#使用SQL DataAdapter数据适配代码实例

    SQL DataAdapter 是什么? SQL DataAdapter 是 ADO.NET 的一部分,他允许 C# 将数据从 SQL 数据库服务器检索到以 DataSet 和 DataTable 对象表示的本地内存中。使用 DataAdapter 对象,可以轻松地自动化与数据源的通信和数据填充。 C# 使用 DataAdapter 填充 DataSet 的…

    C# 2023年6月2日
    00
  • .net 生成拼音码与五笔码实例代码

    针对如何实现“.NET 生成拼音码与五笔码”这个功能,我们可以采用以下两种方式。 1. 使用第三方库实现 可以使用第三方库实现该功能,比如 Pinyin4net、Microsoft Input Method Editor(IME)等。其中,Pinyin4net 是一款开源的拼音转换库,支持多种方式的拼音解析,而 Microsoft IME 是 Microso…

    C# 2023年5月31日
    00
  • asp.net core 腾讯验证码的接入示例代码

    下面是 “asp.net core 腾讯验证码的接入示例代码” 的完整攻略: 1. 腾讯验证码介绍 腾讯验证码是腾讯公司开发的一种防机器人验证码。 它使用了图片旋转、文字扭曲等技术,旨在防止自动化程序通过暴力猜测或爬虫攻击来访问网站。 如今,腾讯验证码已经成为全球流行的验证码解决方案之一。 2. asp.net core 腾讯验证码接入步骤 步骤1:申请腾讯…

    C# 2023年5月31日
    00
  • c# 常用框架汇总

    C#常用框架汇总 在C#开发中,有很多常用的框架可以帮助我们快速开发、简化操作和提高效率,比如ASP.NET Core、Entity Framework、NLog等。本篇攻略将会汇总一些常用的C#框架,并对这些框架的特点、使用方法和示例进行详细讲解。 1. ASP.NET Core ASP.NET Core是微软官方推出的一套跨平台的Web应用程序框架,它旨…

    C# 2023年5月15日
    00
  • C# winform分页查询的实现示例

    针对C# winform分页查询的实现,我将提供以下完整攻略: 1. 控件设计 首先,我们需要在winform中设计一个窗体,包含各种查询条件的输入框、按钮以及查询结果的显示表格。其中最重要的是要添加一个分页控件,用于分页查询结果。 2. 数据库操作 接下来,我们需要对数据库进行操作,从数据库中查询所需的数据。这里我们可以使用SQL语句进行查询,然后将查询结…

    C# 2023年6月1日
    00
  • win8 Could not load type System.ServiceModel.Activation.HttpModule 错误解决方案

    下面是关于“win8CouldnotloadtypeSystem.ServiceModel.Activation.HttpModule错误解决方案”的完整攻略,包含两个示例。 1. 错误描述 在Windows 8操作系统上,当使用IIS 8.0托管WCF服务时,可能会出现以下错误: Could not load type ‘System.ServiceMod…

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