草庐IT

c++函数传参方式

JeremyL 2023-03-28 原文

# 1. 直接传值

函数内部的计算并不会影响全局变量;也就是形参的改变不影响实参;

#include<iostream>
using namespace std;
void add(int a, int b)
{
    a = a + b;
    cout << a<< " "<< b<<endl;
    cout << &a<<endl;
}
int main()
{
    int a = 1;
    int b = 2;
    add(a, b);
    cout << a<<" "<<b<<endl;
    cout << &a<<endl;
    return 0;
}

/*
3 2
0x7ffc185a631c
1 2
0x7ffc185a6338
*/

输出结果显示,形参变化,并未影响到实参;并且二者存放的地址也不一样。

# 2. 传指针

  • 形参和实参指针的地址不同,但是指向同一个地址;

  • 修改函数内部指针指向的地址的值会影响到外部变量;

  • 修改函数内部指针的指向,不会影响外部指针;

#include<iostream>
using namespace std;
void add(int *a, int *b)
{
    *a = *a + *b;
    cout << *a<<endl;
    cout << a<<endl;
    cout << &a<<endl;
    int d = 11;
    a = &d;
    cout << *a<<endl;
    cout << a<<endl;
    cout << &a<<endl;
}
int main()
{
    int c = 1;
    int b = 2;
    int* a;
    a = &c;
    add(a, &b);
    cout << *a<<endl;
    cout << a<<endl;
    cout << &a<<endl;
    return 0;
}


/*
3
0x7fff6d3ff62c
0x7fff6d3ff5f8
11
0x7fff6d3ff60c
0x7fff6d3ff5f8
3
0x7fff6d3ff62c
0x7fff6d3ff620
*/

# 3. 传引用

&可以用来申明引用和取地址;

## 3.1 引用

二者的区别可以从定义看出来:

  • 引用变量是一个变量的别名,就是给已经存在的变量取一个新的名字。记住:
    • 1)不存在空引用;
    • 2)引用被初始化为一个对象,就不能被指向到另一个对象;
    • 3)引用必须在创建时被初始化。
    • 4)对引用的操作就是对原变量的操作

创建引用:

类型名 & 别名 = var;

## 3.2 取址符

获取变量在内存中的储存地址;一般赋值给指针;

## 3.3 引用作为参数的实例

#include<iostream>
using namespace std;
void add(int &a, int &b)
{
    a = a + b;
    cout << a<< " "<< b<<endl;
    cout << &a<<endl;
}
int main()
{
    int a = 1;
    int b = 2;
    add(a, b);
    cout << a<<" "<<b<<endl;
    cout << &a<<endl;
    return 0;
}

/*
3 2
0x7fff5baba32c
3 2
0x7fff5baba32c
*/

对引用操作就是对变量直接操作,因此函数内部对形参的改变会直接改变外部变量。

# 4. 总结

  • 值作为函数参数:不影响实参
    • 函数内部的计算并不会影响全局变量;也就是形参的改变不影响实参;
  • 指针作为函数参数:影响实参
    • 形参和实参指针的地址不同,但是指向同一个地址;
    • 修改函数内部指针指向的地址的值会影响到外部变量;
    • 修改函数内部指针保存的地址,不会影响外部指针保存的地址;
  • 引用作为函数参数:影响实参
    • 对引用操作就是对变量直接操作,因此函数内部对形参的改变会直接改变外部变量。

# 参考:

C++ 函数参数传递的三种方式 (传参、传地址、传引用)

C++ 引用

有关c++函数传参方式的更多相关文章

  1. ruby - 如何以所有可能的方式将字符串拆分为长度最多为 3 的连续子字符串? - 2

    我试图获取一个长度在1到10之间的字符串,并输出将字符串分解为大小为1、2或3的连续子字符串的所有可能方式。例如:输入:123456将整数分割成单个字符,然后继续查找组合。该代码将返回以下所有数组。[1,2,3,4,5,6][12,3,4,5,6][1,23,4,5,6][1,2,34,5,6][1,2,3,45,6][1,2,3,4,56][12,34,5,6][12,3,45,6][12,3,4,56][1,23,45,6][1,2,34,56][1,23,4,56][12,34,56][123,4,5,6][1,234,5,6][1,2,345,6][1,2,3,456][123

  2. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  3. ruby - 在没有 sass 引擎的情况下使用 sass 颜色函数 - 2

    我想在一个没有Sass引擎的类中使用Sass颜色函数。我已经在项目中使用了sassgem,所以我认为搭载会像以下一样简单:classRectangleincludeSass::Script::FunctionsdefcolorSass::Script::Color.new([0x82,0x39,0x06])enddefrender#hamlengineexecutedwithcontextofself#sothatwithintemlateicouldcall#%stop{offset:'0%',stop:{color:lighten(color)}}endend更新:参见上面的#re

  4. ruby-on-rails - 在 ruby​​ 中使用 gsub 函数替换单词 - 2

    我正在尝试用ruby​​中的gsub函数替换字符串中的某些单词,但有时效果很好,在某些情况下会出现此错误?这种格式有什么问题吗NoMethodError(undefinedmethod`gsub!'fornil:NilClass):模型.rbclassTest"replacethisID1",WAY=>"replacethisID2andID3",DELTA=>"replacethisID4"}end另一个模型.rbclassCheck 最佳答案 啊,我找到了!gsub!是一个非常奇怪的方法。首先,它替换了字符串,所以它实际上修改了

  5. ruby - 在 Ruby 中有条件地定义函数 - 2

    我有一些代码在几个不同的位置之一运行:作为具有调试输出的命令行工具,作为不接受任何输出的更大程序的一部分,以及在Rails环境中。有时我需要根据代码的位置对代码进行细微的更改,我意识到以下样式似乎可行:print"Testingnestedfunctionsdefined\n"CLI=trueifCLIdeftest_printprint"CommandLineVersion\n"endelsedeftest_printprint"ReleaseVersion\n"endendtest_print()这导致:TestingnestedfunctionsdefinedCommandLin

  6. ruby-on-rails - 正确的 Rails 2.1 做事方式 - 2

    question的一些答案关于redirect_to让我想到了其他一些问题。基本上,我正在使用Rails2.1编写博客应用程序。我一直在尝试自己完成大部分工作(因为我对Rails有所了解),但在需要时会引用Internet上的教程和引用资料。我设法让一个简单的博客正常运行,然后我尝试添加评论。靠我自己,我设法让它进入了可以从script/console添加评论的阶段,但我无法让表单正常工作。我遵循的其中一个教程建议在帖子Controller中创建一个“评论”操作,以添加评论。我的问题是:这是“标准”方式吗?我的另一个问题的答案之一似乎暗示应该有一个CommentsController参

  7. ruby - 在 Ruby 中按名称传递函数 - 2

    如何在Ruby中按名称传递函数?(我使用Ruby才几个小时,所以我还在想办法。)nums=[1,2,3,4]#Thisworks,butismoreverbosethanI'dlikenums.eachdo|i|putsiend#InJS,Icouldjustdosomethinglike:#nums.forEach(console.log)#InF#,itwouldbesomethinglike:#List.iternums(printf"%A")#InRuby,IwishIcoulddosomethinglike:nums.eachputs在Ruby中能不能做到类似的简洁?我可以只

  8. 【鸿蒙应用开发系列】- 获取系统设备信息以及版本API兼容调用方式 - 2

    在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList​()Obt

  9. C51单片机——实现用独立按键控制LED亮灭(调用函数篇) - 2

    说在前面这部分我本来是合为一篇来写的,因为目的是一样的,都是通过独立按键来控制LED闪灭本质上是起到开关的作用,即调用函数和中断函数。但是写一篇太累了,我还是决定分为两篇写,这篇是调用函数篇。在本篇中你主要看到这些东西!!!1.调用函数的方法(主要讲语法和格式)2.独立按键如何控制LED亮灭3.程序中的一些细节(软件消抖等)1.调用函数的方法思路还是比较清晰地,就是通过按下按键来控制LED闪灭,即每按下一次,LED取反一次。重要的是,把按键与LED联系在一起。我打算用K1来作为开关,看了一下开发板原理图,K1连接的是单片机的P31口,当按下K1时,P31是与GND相连的,也就是说,当我按下去时

  10. ruby-on-rails - 将字符串转换为 ruby​​-on-rails 中的函数 - 2

    我需要一个通过输入字符串进行计算的方法,像这样function="(a/b)*100"a=25b=50function.something>>50有什么方法吗? 最佳答案 您可以使用instance_eval:function="(a/b)*100"a=25.0b=50instance_evalfunction#=>50.0请注意,使用eval本质上是不安全的,尤其是当您使用外部输入时,因为它可能包含注入(inject)的恶意代码。另请注意,a设置为25.0而不是25,因为如果它是整数a/b将导致0(整数)。

随机推荐