函数传参

C语言函数参数传递的方式可分为3种:值传递,地址传递。(C++中还有引用传递)

通常的建议:

如果传值的话,会生成新的对象,花费时间和空间,而在退出函数的时候,又会销毁该对象,花费时间和空间。

因而如果int,char等固有类型,而是你自己定义的类或结构等,都建议传指针或引用,因为他们不会创建新的对象。

1.值传递:就是把你的变量的值传递给函数的形参,实际就是用变量的值来新生成一个形参,因而在函数里对形参的改变不会影响到函数外的变量的值

void exchg1(int x,int y)

{

int tmp;

tmp=x;

x=y;

y=tmp;

printf("x=%d,y=%d\n",x,y);

}

main()

{

int a=3,b=6;

exchg1(a,b);

printf("a=%d,b=%d\n",a,b);

}

/*其实,函数在调用时,是隐含的把实参a,b的值赋给了形参x,y,之后在函数体内的交换并没有对a,b进行任何操作了,交换的只是x,y变量。这就是所谓的参数的值传递了。*/

2.地址传递:就是传变量的地址赋给函数里形参指针,使指针指向真实的变量的地址,因为对指针所指地址的内容的改变能反映到函数外,也就是能改变函数外的变量的值

void exchg2(int* px,int* py)

{

int tmp = *px;

*px=*py;

*py=tmp;

printf("*px=%d,*py=%d\n",*px,*py);

}

main()

{

int a=3,b=6;

exchg2(&a,&b);

printf("a=%d,b=%d\n",a,b);

}

/*此函数调用的时候也是做了两个隐含的操作,将a,b的地址&a,&b分别带入px,py。经过这样的操作,px,py的值已经分别是a,b变量的地址值了。后面对*px和*py的操作自然是对a,b变量本身的操作了。*/

3.引用传递(C++):实际是通过指针来实现的,能达到使用的效果如传址,可是使用方式如传值。

#include<stdio.h>

void exchg3(int &x, int& y)

{

int tmp = x;

x=y;

y=tmp;

printf("x=%d,y=%d\n",x,y);

}

main()

{

int a=3,b=6;

exchg3(a,b);

printf("a=%d,b=%d\n",a,b);

}

/*参数x,y是int型变量,调用时我们可以想值传递一样调用函数,但是参数前面的&就使得a,b分别代替了x,y,我们称x,y分别引用了a,b变量*/

voidbackward(intn)

{

cout<<n%10;

if(n<10)return;

elsebackward(n/10);

}

intmain()

{

intn;

cout<<"输入整数:"<<endl;

cin>>n;

cout<<"原整数:"<<n<<endl<<"反向数:";

backward(n);

cout<<endl;

return0;

}

函数可以有返回值,只要 return 就可以给出一个。不过我们常常不用它--有两个原因:

1、C/C++里返回值是复制出去的,而对于大的对象,复制的代价很高;

2、有些对象是不能复制的--至少编译器不知道怎么复制--比如数组。

于是我们有了很多这样的函数:

bool GetObj(ObjType& obj);

bool Encode(const char* src, char* dest);

用一个参数来代替返回值,而返回值只是指示函数执行是否成功。我本人一直固执的认为,这是C的处理方式,C++不该这样,返回就是返回,就该光明正大的返回,而不是在文档里为某个参数悄悄注上out。

诚然返回一个大对象是困难的,但这个困难是 C 程序员的,而不是 C++ 程序员的 -- 我们可以返回指针。C也有指针,但很少有人敢在 C 函数里返回一个指针,因为:

1、如果指针指向栈变量,毫无疑问,要么你不用这个返回值,要么是一个错误;

2、如果指针指向堆变量,要么你在祈祷用这个函数的程序员会好好的看文档且足够细心会调用 free,    要么就是内存泄漏;

3、如果指针指向 static 变量,那么用这个函数的程序员牢牢记住“下次调用这个函数以后,上次的返    回值也会跟着变”,要么就是你被别人骂成“专出 BUG 的垃圾”。

时间: 2024-12-16 05:53:55

函数传参的相关文章

【JS学习笔记】函数传参

比如仅仅改变背景的颜色 函数传参:参数就是占位符. 那么在什么时候用传参呢?函数里定不下来的东西. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml">

函数传参,改变Div任意属性的值&amp;&amp;图片列表:鼠标移入/移出改变图片透明度

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-

c# 通用类型系统 深拷贝 浅拷贝 函数传参

c# 通用类型系统 及变量在 深拷贝 浅拷贝 函数传参 中的深层次的表现 在编程中遇到了一些想不到的异常,跟踪发现,自己对于c#变量在内存上的表现理解有偏差,系统的学习并通过代码实验梳理了各种情况下,变量在内存级的表现情况,对以后的coding应该有些帮助.在此记录以免忘记了... 1. 通用类型系统 先来一张图: 通用数据类型分为了值类型和引用类型. 我们定义一个int型实际上是一个system.int32的实例,在语法上我们像使用其他的类对象一样,但是,存储的的仍然是基本类型.这种把基本类型

C语言之main函数传参

1:为什么需要给main函数传参 首先要明白一点,给mian函数传参不是必须的,但是有时候我们需要通过给main函数不同的参数来得到的不同的结果,比如我们希望main函数中某个变量的值为0时执行子函数A,该变量值为1时执行子函数B,那么这个时候就可以通过给main函数传参来实现,mian函数传参格式如下: int main(int argc , char *argv[]) int main(int argc , char **argv) 参数解释: argc:int类型的参数,表示给mian函数

js最基础知识回顾2(函数传参,操作属性的第二种方式,提取行间事件,操作一组元素,this,焦点问题和鼠标按下抬起,选项卡)

一.函数传参     1.函数传参:参数就是占位符----函数里定不下来的东西 a. var a1=function(){ alert(123); }; function a(f){ // 相当于 f=a1 f(); }; a(a1); b.  function skip(skipPath){  //换肤 var oLink1 = document.getElementById('link1'); oLink1.href=skipPath; } c.   function setStyle(na

2、函数传参

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>2.函数传参</title> <link href="base.css"> <style> li{ padding-bottom: 50px; } .l{ border: 1px solid #ccc; width

javascript函数传参

javascript中函数的传参方式是比较奇葩的; javascript并没有按引用传递参数的方式,不严格的说全部为按值传递,但是对于引用类型来说,个人觉得这个像是共享传递 基本类型作为参数传入函数(只是将值复制给函数内部的一个局部变量) var a = 10; function foo(a) { a = 20; return a; } console.log(foo(a));  // 20 console.log(a);   // 10 对于基本类型只是简单的将值赋给函数内部的一个局部变量,所

js函数传参

js所有函数传参都是按值传递 1>传基本参数类型:被传递的值复制给函数形参 function addMath(num){ num += 10; return num; } var counts = 20; var results = addMath(counts); alert("count="+counts+",result="+results); couts未改变,不是按引用传递的 2>传递obj类型 function setName(obj){ o

Python类三种方法,函数传参,类与实例变量(一)

1 Python的函数传递: 首先所有的变量都可以理解为内存中一个对象的'引用' a = 1 def func(a): a = 2 func(a) print(a) # 1 a = 1 def fun(a): print("函数里",id(a)) # 函数里 41322472 a = 2 print("赋值后",id(a), id(2)) # 赋值后 41322448 41322448 print("函数外",id(a), id(1)) # 函数

python 基础之函数传参

函数传参 - 对不可变变量来说,传递的是值,函数中不可能改变传递的参数 - 对于可变变量及自定义的类创建的对象,传递的是引用,函数中可以操作原对象 - 示例: python def test(a): a += 1 num = 100 # 对于不可变数据传递的是值 test(num) print(num) def test2(lt): lt[0] = 10 lt = [1, 2, 3] test2(lt) print(lt) 原文地址:https://www.cnblogs.com/liangli