函数参数初探

一.三种传参方式

三种基本的传参方式:值传递,指针传递,引用传递

1. 值传递

首先来看一段代码:

 1 void SwapByVal(int a,int b)
 2 {
 3     int temp = a;
 4     a = b;
 5     b = temp;
 6 }
 7 int main()
 8 {
 9     int a = 5,b = 9;
10     SwapByVal(a, b);
11     std::cout << "a == " << a << " \n" << "b == " << b << "\n";
12     return 0;
13 }

输出的是 a == 5 b == 9

也就是说,原本是想交换他们的值,但是这里没有交换成功,那么稍微修改下代码:

 1 void SwapByVal(int a,int b)
 2 {
 3     int temp = a;
 4     a = b;
 5     b = temp;
 6     std::cout << "a == " << &a << " \n" << "b == " << &b << "\n";
 7 }
 8 int main()
 9 {
10     int a = 5,b = 9;
11     std::cout << "a == " << &a << " \n" << "b == " << &b << "\n";
12     SwapByVal(a, b);
13     std::cout << "a == " << a << " \n" << "b == " << b << "\n";
14     return 0;
15 }

把主函数中的a和b的地址输出出来,然后再把函数中的a和b的地址输出来

输出结果如下:

这里就可以发现主函数中的a和交换函数中的a的地址不一样,b也是。我们可以把地址想象成一个独立的空间,他们的空间都不一样,一个空间里面的任何东西发生改变,都不会影响另一个空间的东西。又不是平行世界。

那是不是值传递就没有什么用武之处了呢?不是,反而值传递在使用中很频繁的用到。当你只是希望把值传递到另一个函数里面,你只是关心这个值的时候就可以使用这种方法。

2. 指针传递

继续先看一段代码:(为了解释清楚,我这里把形参变一下)

 1 void SwapByPointOne(int *p, int *q)
 2 {
 3     int *temp = p;
 4     p = q;
 5     q = temp;
 6 }
 7 void SwapByPointTwo(int *p, int *q)
 8 {
 9     int temp = *p;
10     *p = *q;
11     *q = temp;
12 }

在main函数中调用:

1 SwapByPointOne(&a, &b);
2 SwapByPointTwo(&a, &b);

为什么会有两种写法呢?输出会不会一样?

先不说输出,先看SwapByPointOne函数,打个形象的例子。我们把内存比作房子,地址比作门牌号,指针比作这个房子外面的标识建筑。a和b在创建的时候就给了他一个门牌号。编辑器是一个邮递员,他只知道a的地址和b的地址是什么,他不关心房子里面住的哪些人,他也是通过地址来发邮件。q和p是个指针,也就是房子外面的标识,一般情况下我们可以通过这个标识来找到他所对应的门牌号,但是,这个标识不是固定的,也许要整改,也许其他原因,他会站到其他门牌号码去。SwapByPointOne就是交换了p和q的位置,但是,邮递员根本不管这个标识,他不熟悉这个地方,也不可能通过标识来派发邮件。那么他只能根据地址来派发邮件。管你标识变不变。所以,这里只是标识变了,但是对于邮递员来说,他只要按照地址去找就不会派发错误的邮件,房子里面的人还是地址上写的那个人。 所以,这里a和b不变。

再来看看SwapByPointTwo这个函数,按照之前的说法,p和q是站在门牌号外面的标识。这里没有交换p和q的位置,却把p和q指向的门牌号对应的房子里的东西都交换了,由于邮递员不关心房子里面到底是什么,所以交换了他也不知道,还是会按照门牌号去派发邮件,结果,里面的人和东西都改变了。所以,这里a和b成功交换。

3.引用传递

同样先看一段代码:

1 void SwapByRef(int &p,int &q)
2 {
3     int temp = p;
4     p = q;
5     q = temp;
6 }

在main函数中调用:

1 SwapByRef(a, b);

根据对指针传递的分析,这里可以形象的理解为SwapByRef 传递的就是a和b的地址,也就是门牌号,而SwapByRef函数本身就是对门牌号对应的房子里面的东西进行交换。那么就可以得出a和b交换成功。

我们在使用指针传递和引用传递的时候应该注意在函数体内对其内存的内容进行修改的时候是会修改实参的内容的,特别是在把一个类的指针对象当作函数的参数传递的时候,更需要很小心处理这个问题。当然,这涉及到之前工作的一个笑话,然后又涉及到类的浅拷贝和深拷贝问题。以后再来说这些问题了。

二. 数组作为函数参数

仍然是先看一段代码:

 1 void ChangeByArry(int arry[])
 2 {
 3     arry[1] = 2;
 4 }
 5 void ChangeByArryTwo(int *arry)
 6 {
 7     arry[1] = 2;
 8 }
 9 int main()
10 {
11     int a[3] = { 0,1,2 };
12     ChangeByArryTwo(a);
13     cout << "xxxxxxxxxx== " << a[1] << endl;
14     return 0;
15 }

写简单点,这里有一点要说明,就是数组名在作为形参的时候是要退化成指针的。这点也是面试的时候经常考到的,在函数体内sizeof(arry) 应该为4

差不多就这些,其实还有一个就是把函数名作为参数传递。

难免有误,我只是个想巩固基础的新手0-0 。

时间: 2024-11-08 05:59:00

函数参数初探的相关文章

第7课 函数参数的扩展

1.  函数参数的默认值 (1)C++中可以在函数声明时为参数提供一个默认值(注意是声明,不能在定义中提供) (2)当函数调用时没有提供参数的值,则使用默认值 [实例分析]默认参数值初探 #include <stdio.h> //默认值只能在函数声明时提供 int mul(int x = 0); //参数x的默认值为0 int main() { printf("%d\n", mul()); //传入默认值0 printf("%d\n", mul(-1))

python--函数的返回值、函数参数的使用、名称空间与作用域、函数嵌套、函数对象

今天学习内容有函数的返回值.函数参数的使用.名称空间与作用域.函数嵌套. 下来我们一一查看. 函数的返回值 看几个栗子: def func(x): return x**2 y=func(10) print(y) def foo(): return None res=foo() print(res) def foo(): return{'a':1} res=foo() print(res['a']) def foo(): return {'a':1},1,'a',[1,2] res=foo() p

python基础教程函数参数

python里有很多的内置函数给我们的工作带来了很多发便利,在我们实现某些功能或者优化代码的时候,可以自己定义一个函数,同时我们在定义一个类的时候也会用到函数的一些知识去构造一个方法,这里就涉及到一些关于函数的基础知识和函数传参的知识. 一.函数的相关介绍 1.函数定义:函数是指将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需调用其函数名即可. 函数特性: 减少重复代码 使程序变的可扩展 使程序变得易维护 2.函数的定义示例 定义一个函数要使用def语句,依次写出函数名.括

C言语指针变量作为函数参数

在C言语中,函数的参数不只可所以整数.小数.字符等详细的数据,还可所以指向它们的指针.用指针变量作函数参数可以将函数内部的地址传递到函数外部,使得在函数外部可以操作函数内部的数据,而且这些数据不会跟着函数的完毕而被烧毁.像数组.字符串.静态分派的内存等多是一系列数据的聚集,没有方法经过一个参数全体传入函数外部,只能传递它们的指针,在函数外部经过指针来影响这些数据聚集.有的时分,关于整数.小数.字符等根本类型数据的操作也必需要借助指针,一个典型的例子就是交流两个变量的值.有些初学者能够会运用下面的

C++数组作为函数参数的几个问题(转)

本文需要解决C++中关于数组的2个问题:1. 数组作为函数参数,传值还是传址?2. 函数参数中的数组元素个数能否确定? 先看下面的代码. #include <iostream> using namespace std; void testArrayArg(int a[]) { cout << endl; cout << "in func..." << endl; cout << "array address: &qu

实现按行读取文件,把内容按照第三种内存模型打包数据传出,把行数通过函数参数传出。

/* 2 编写一个业务函数,实现按行读取文件.把内容按照第三种内存模型打包数据传出,把行数通过函数参数传出. 函数原型有两个,任意选择其一 要求1:请自己任意选择一个接口(函数),并实现功能:70分 要求2:编写测试用例.30分 要求3:自己编写内存释放函数 */ /********************************************************************** * 版权所有 (C)2015, Wu Yingqiang. * * 文件名称:ReadFi

javascript函数参数、返回值类型检查

实现带参数.返回值类型声明的js函数: 类型定义:window.Str = Type.Str = Type.define('STRING', Type.isStr);var Per = Type.define('PERSON', function(p){    return p && p.type === 'person' && p.name;}); 定义函数:var addStr = Str(function(a, b){  return a + b;}, Str, St

VBA自定义函数参数类型不符的错误

作者:iamlaosong 1.问题提出 编程中发现一个问题,系统总是提示编译错误,ByRef 参数类型不符, 可实际上参数定义没问题,原因在哪儿呢? 2.问题环境 假定函数定义如下: Function get_kind(addr As String) As Integer ...... End Function 调用过程: Sub check_address() Dim addr, new_addr(10000) As String ...... addr = new_addr(i) ....

一起入门python7之函数参数

上一节课简单的讲了一下函数.那么今天来给大家讲一下函数参数.用案例说话哈.上一节课只是让大家有比较简单的了解,那么这节我们来细化一下哈.>>>def hello(x):        #这里的x就是参数return x * x>>>hello(2)               #自动将x=2带入x*x当中去计算了.故得四.4>>>#大家想一下,倘若是次方的该怎么办?比如x的n次方.>>> def wa(x,n):    #首先先定义两