超详细讲解C++的三种函数传递方式

目录
  • 一、值传递
  • 二、地址传递
    • 1.指针的有关知识
    • 2.地址传递举例
  • 三、引用传递
    • 1.引用的相关知识
    • 2.引用传递举例
  • 四、三种传参方式的比较
  • 总结

一、值传递

代码如下:

void swap1(int x,int y)
{
	int temp = x;
    x = y;
    y = temp;
}//main函数里写入 swap1(a,b);即可 其中x,y形参  a,b实参

这里我用swap1()交换函数做举例,函数内容部分是非常经典的三步交换值的代码,这样就完成了一个非常简单的值传递函数。

二、地址传递

1.指针的有关知识

我们经常听到这样一句话“指针指向地址”,没错,指针用来存放变量的地址,这样可以有效的节省内存空间。例如

int a=6; int *p=&a; cout<<"a的值为:"<<a<<endl; 和cout<<"*p的值为:"<<*p<<endl;

上面两个输出结果都是一样的,其中p=&a,意为p现在是变量a的地址,而*p就相当于*&a,这样*和&抵消,实际上*p就表示变量a的值

2.地址传递举例

代码如下:

void swap2(int *x,int *y)
{
	int temp = *x;
    *x = *y;
    *y = temp;
}//main函数里写 swap2(&a,&b) *x和*y为形参,a和b为实参

这里不同于值传递的是,传入实参的时候加上了&符号。因为函数传参规定对应的数据类型需要一致,所以不难理解*x=&a,*y=&b

三、引用传递

1.引用的相关知识

示例:int a=10; int &b=a; cout<<"a="<<a<<endl;cout<<"b="<<b<<endl;

上面两个输出结果都是10 其实引用就是给变量起个别名,就比如你小名张三,长大了叫张大仙,当你张三18岁了,那么张大仙也18岁,无论改变a还是b,他们两个的结果都一样

2.引用传递举例

代码如下:

void swap3(int &x,int &y)
{
	int temp = x;
    x = y;
    y = temp;
}//main 里写 swap3(a,b)  &x,&y为形参 a,b为实参

这里跟我上面提到的一致,就是 &x=a a的别名为x; 那么x和y的改变就会影响a和b的值,从而完成交换数据的任务

四、三种传参方式的比较

值传递形参不能修饰实参:第一种值传递后主函数a,b的值并没有发生改变,因为如果传的只是变量的值,那么编译器会拷贝一个副本,只是把a,b的值赋给了x和y,很显然这种方式的a和x的地址不相同,就比如现在有一个香蕉,我利用克隆技术复制了一个一模一样的出来,我把克隆的吃了,那原来的肯定还在,并不影响原来的香蕉。

地址传递的形参可以修饰实参,利用指针和引用方法,传递的都是变量的地址,所以形参的改变会引起实参的变化。

总结

以上就是我分享给大家的三种函数值传递方式,我个人推荐多使用引用传递,相比于值传递他不会产生副本,节省空间,相比于指针他的形式更简单,效果却一样,如果有错误或者有更好的见解一定私信我,共同进步哦

到此这篇关于超详细讲解C++的三种函数传递方式的文章就介绍到这了,更多相关C++函数传递内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 详解C++编程中向函数传递引用参数的用法

    引用类型的函数参数 向函数传递引用而非大型对象的效率通常更高. 这使编译器能够在保持已用于访问对象的语法的同时传递对象的地址. 请考虑以下使用了 Date 结构的示例: // reference_type_function_arguments.cpp struct Date { short DayOfWeek; short Month; short Day; short Year; }; // Create a Julian date of the form DDDYYYY // from a

  • 把Lua函数传递到C/C++中实例

    问题 在Lua中,因为函数也是第一类值,所以会出现将函数作为另一个函数的参数,或者函数作 为函数的返回值.这种机制在很多地方都能代码更灵活更简洁,例如: 复制代码 代码如下: table.sort(table [,comp]) 这里的comp就要求传入一个函数,我们在调用时,大概会有如下形式: 复制代码 代码如下: table.sort(t, comp) -- 直接写函数名     table.sort(t, local_comp) -- 某个局部函数     table.sort(t, fun

  • 超详细讲解C++的三种函数传递方式

    目录 一.值传递 二.地址传递 1.指针的有关知识 2.地址传递举例 三.引用传递 1.引用的相关知识 2.引用传递举例 四.三种传参方式的比较 总结 一.值传递 代码如下: void swap1(int x,int y) { int temp = x; x = y; y = temp; }//main函数里写入 swap1(a,b);即可 其中x,y形参 a,b实参 这里我用swap1()交换函数做举例,函数内容部分是非常经典的三步交换值的代码,这样就完成了一个非常简单的值传递函数. 二.地址

  • C语言函数超详细讲解下篇

    目录 前言 函数的声明和定义 函数声明 函数定义 举例 简单的求和函数 把加法单独改写成函数 添加函数声明 带头文件和函数声明 静态库(.lib)的生成 静态库文件的使用方法 函数递归 什么是递归? 递归的两个必要条件 练习1 一般方法 递归的方法 练习2 一般方法 递归方法 练习3 一般方法 递归方法 练习4 一般方法 递归方法 递归与迭代 递归隐藏的问题 如何改进 选递归还是迭代 总结 前言 紧接上文,继续学习函数相关内容. 函数的声明和定义 函数声明 告诉编译器有一个函数叫什么,参数是什么

  • C语言超详细讲解getchar函数的使用

    目录 一.getchar 函数 二.缓冲区 1.什么是缓冲区 2.为什么要存在缓冲区 3.缓冲区的类型 4.缓冲区的刷新 三.getchar 函数的正确使用 1.getchar 的换行问题 2.getchar 与 scanf 的混合使用 一.getchar 函数 从上面的介绍来看,我们要正确使用getchar函数,首先得了解什么是缓冲区. 二.缓冲区 1.什么是缓冲区 缓冲区又称为缓存,它是内存空间的一部分. 也就是说,在内存空间中预留了一定的存储空间,这些存储空间用来缓冲输入或输出的数据,这部

  • C++超详细讲解函数重载

    目录 1 函数重载的定义 2 构成函数重载的条件 3 编译器调用重载函数的准则 4 函数重载的注意事项 4.1 避开重载带有指定默认值参数的函数 4.2 注意函数重载遇上函数指针 4.3 C++编译器不能以 C 的方式编译重载函数 1 函数重载的定义 函数重载:使用同一个函数名定义不同的函数.从本质上来看,就是互相独立的不同函数,每一个函数类型不同.因此,函数重载是由函数名和参数列表决定的. 注意:函数返回值不能作为函数重载的重要依据! 2 构成函数重载的条件 当满足以下三个条件之一时,便可以构

  • C语言超详细讲解指向函数的指针

    目录 一.函数的指针 二.指向函数的指针变量 三.调用函数的两种方式 四.指向函数的指针的作用 五.用指向函数的指针作函数参数(重点) 六.为什么要将指向函数的指针变量作为函数的形参(重点) 一.函数的指针 首先,函数名代表函数的起始地址,调用函数时,程序会从函数名获取到函数起始地址,并从该地址起执行函数中的代码,函数名就是函数的指针,所以我们可以定义一个指向函数的指针变量,用来存放函数的起始地址,这样一来,就可以通过该变量来调用其所指向的函数. 二.指向函数的指针变量 定义指向函数的指针变量

  • C++函数模板与重载解析超详细讲解

    目录 1.快速上手 2.重载的模板 3.模板的局限性 4.显式具体化函数 5.实例化和具体化 6.重载解析 6.1 概览 6.2 完全匹配中的三六九等 6.3 总结 7.模板的发展 1.快速上手 函数模板是通用的函数描述,也就是说,它们使用泛型来定义函数. #include<iostream> using namespace std; template <typename T> void Swap(T &a,T &b);//模板原型 struct apple{ st

  • GoLang中panic与recover函数以及defer语句超详细讲解

    目录 一.运行时恐慌panic 二.panic被引发到程序终止经历的过程 三.有意引发一个panic并让panic包含一个值 四.施加应对panic的保护措施从而避免程序崩溃 五.多条defer语句多条defer语句的执行顺序 一.运行时恐慌panic panic是一种在运行时抛出来的异常.比如"index of range". panic的详情: package main import "fmt" func main() { oneC := []int{1, 2,

  • C语言函数超详细讲解上篇

    目录 前言 1.函数是什么? 2.C语言中函数的分类 2.1 库函数 2.1.1 如何学会使用库函数 2.1.2 自定义函数 3.函数的参数 3.1 实际参数(实参) 3.2 形式参数(形参) 4.函数的调用 4.1 传值调用 4.2 传址调用 4.3 练习 4.3.1 判断一个数是不是素数 4.3.2 判断一年是不是闰年 4.3.3 二分查找 4.3.4 数值自增增加1 5.函数的嵌套调用和链式访问 5.1 嵌套调用 5.2 链式访问 总结 前言 本文主要学习函数的相关内容. 1.函数是什么?

  • C++超详细讲解隐藏私有属性和方法的两种实现方式

    目录 例子 用抽象类解决问题 用Pimpl风格解决问题 总结 参考 在我们编写程序的时候,会将程序模块化,常见的就是用动态链接库的方式,然后导出函数接口或者类.而对于导出类的方式,作为模块的实现者,不论是给第三方使用或者自己的项目使用,应该都不太愿意暴露自己的私有属性和方法,个人碰到的主要有以下两个常见原因: 通过隐藏私有属性和方法,让被调用者猜不到其实现方式 私有方法中或者属性中,可能会存在一些第三方的头文件或者库的依赖,而对于被调用方来说不应该直接依赖 本文将介绍两种方式来满足以上的需求,一

  • C++超详细讲解函数对象

    目录 一.客户需求 二.存在的问题 三.解决方案 四.函数对象 五.小结 一.客户需求 编写一个函数 函数可以获得斐波那契数列每项的值 每调用一次返回一个值 函数可根据需要重复使用 下面来看第一个解决方案: #include <iostream> using namespace std; int fib() { static int a0 = 0; static int a1 = 1; int ret = a1; a1 = a0 + a1; a0 = ret; return ret; } in

随机推荐