精华内容
下载资源
问答
  • C语言函数传递方式-值传递和地址传递

    千次阅读 多人点赞 2020-03-02 12:10:20
    C语言函数传递方式 值传递 定义 所谓的值传递,顾名思义就是使用变量、常量、数组等作为函数的参数。 地址传递

    C语言函数传递方式

    值传递

    定义

    • 所谓的值传递,顾名思义就是使用变量、常量、数组等作为函数的参数。实际是将实参的值复制到形参相应的存储单元中,即形参和实参分别占用不同的存储单元。

    特点

    • 值传递的特点是单向传递,即主调函数被调用时给形参分配存储单元,把实参的值传递给形参,在调用结束后,形参的存储单元被释放,而形参值的任何变化都不会影响到实参的值,实参的存储单元仍保留并维持数值不变。

    示意图

    值传递示意图
    其实值传递过程中由隐含的一步,如下代码所示:

    	int x = a;
    	int y = b; 
    

    所以swap1函数交换的是x和y,而原来的a和b从未改变。

    代码演示

    void swap1(int x,int y)
    {
    	int temp;
    	temp = x;
    	x = y;
    	y = temp;
    	printf("x = %d,y = %d\n",x,y);	
    }
    int main(int argc, char *argv[]) 
    {
    	int a = 12,b = 24;
        swap1(a,b); // 值传递 
        printf("a = %d b = %d",a,b);
    }
    
    

    运行结果

    值传递运行结果


    地址传递

    说明

    • 大家都知道,在C语言中,数组名就代表数组的首地址。所谓的地址传递,指的就是函数的参数是数组名或者指针。传递的是数组的首地址或指针的值,而形参接收到的是地址,即指向实参的存储单元,形参和实参占用相同的存储单元,即形参和实参是相同的。

    特点

    • 形参并不存在存储空间,编译系统不为形参数组分配内存。因此在数组名或指针作函数参数时所进行的传送只是地址传送,形参在取得该地址之后,与实参共同拥有一段内存空间,形参的变化也就是实参的变化。

    示意图

    地址传递示意图
    注意:这里也有一个隐含动作,如下代码所示:

    	x = &a;
    	y = &b;
    

    分别将a的地址,b的地址赋值给x和y,这样swap2函数操作的数其实就是a和b。

    代码演示

    void swap2(int* x,int* y)
    {
    	int temp;
    	temp = *x;
    	*x = *y;
    	*y = temp;
    	printf("x = %d y = %d\n",*x,*y);
    }
    int main(int argc, char *argv[]) 
    {
    	int a = 12,b = 24;
    	swap2(&a,&b); //地址传递
    	printf("a = %d b = %d",a,b); 
    }
    

    运行结果

    地址传递运行结果
    以上就是C语言值传递和地址传递的区别了,相信大家应该很清楚了吧!

    展开全文
  • 传递函数

    千次阅读 2019-05-06 10:13:07
    开环传递函数 B(s)E(s)\frac{B(s)}{E(s)}E(s)B(s)​ 闭环传递函数C(s)R(s)\frac{C(s)}{R(s)}R(s)C(s)​ 前向通道传递函数C(s)E(s)\frac{C(s)}{E(s)}E(s)C(s)​

    在这里插入图片描述
    开环传递函数 B ( s ) E ( s ) \frac{B(s)}{E(s)} E(s)B(s)
    闭环传递函数 C ( s ) R ( s ) \frac{C(s)}{R(s)} R(s)C(s)
    前向通道传递函数 C ( s ) E ( s ) \frac{C(s)}{E(s)} E(s)C(s)

    展开全文
  • 函数传递参数的三种方式,以及它们的区别1.按值传递(pass by value)使用这种方式,调用函数本省不对实参进行操作,也就是说,即使形参的值在函数中发生了变化,实参的值也完全不会受到影响,仍为调用前的值。这相当...

    函数传递参数的三种方式,以及它们的区别

    1.按值传递(pass by value)

    使用这种方式,调用函数本省不对实参进行操作,也就是说,即使形参的值在函数中发生了变化,实参
    的值也完全不会受到影响,仍为调用前的值。这相当于把实参赋值一份给形参,然后调用后内存回收。
    [cpp] view plain copy

        <span style="font-size:18px;"><strong>#include<stdio.h>  
          
        int sum(int x,int y)  
        {  
            return x+y;  
        }  
        int main()  
        {  
            int result=sum(2,3);//通过直接对sum传递参数   
            printf("%d\n",result);  
            return 0;  
        }</strong></span>  
    2.地址传递(pass by pointer)
    地址传递与按值传递的不同在于,它把实参的存储地址传送给对应的形参,从而使得形参指针和实参指
    针指向同一个地址。因此,被调用函数中对形参指针所指向的地址中内容的任何改变都会影响到实参。
    [cpp] view plain copy

        #include<stdio.h>  
          
        int sum(int* x,int* y)  
        {  
            return *x+*y;  
        }  
        int main()  
        {  
            int a,b;  
            a=2;  b=3;  
            int result=sum(&a,&b);//通过地址对sum传递参数   
            printf("%d\n",result);  
            return 0;  
        }  
    3.引用传递(pass by reference)
    以引用为参数,则既可以使得对形参的任何操作都能改变相应的数据,又使得函数调用显得方便、自然
    。引用传递方式是在函数定义时在形参前面加上引用运算符“&”。引用相当于实参的别名,他和实参是同一个变量或数值,它的改变就是实参的改变。
    [cpp] view plain copy

        <span style="font-size:18px;"><strong>#include<stdio.h>  
          
        int sum(int& x,int& y)<span style="color:#ff0000;">//定义引用类型</span>  
        {  
            return x+y;  
        }  
        int main()  
        {  
            int a,b;  
            a=2;  b=3;  
            int result=sum(a,b);//通过引用对sum传递参数   
            printf("%d\n",result);  
            return 0;  
        }</strong></span>

    展开全文
  • 函数参数三种传递方式的区别

    万次阅读 2017-01-07 13:47:00
    问题提出:1、当一个类的对象作为实参数传递时,使用值传递和引用传递有什么区别? 比如: DateType ExampleFun(CString &strFileName,…)与 DateType ExampleFun(CString strFileName,…)解答之前,我们先来看2...

    函数参数三种传递方式的区别

    问题提出:

    1、当一个类的对象作为实参数传递时,使用值传递和引用传递有什么区别?
    比如: DateType ExampleFun(CString &strFileName,…)与
    DateType ExampleFun(CString strFileName,…)

    解答之前,我们先来看2个基本的概念:形参和实参。

    ->通俗的讲:形参是形式上的参数,实参是实际的参数;
    ->详细的讲:形参只是对实参的一种抽象类型描述,只是声明一个函数(方法)能接受什么类型的实参,而不确定接受的实参具体内容是多少;

    实参就是传递给函数(方法)对应形参的具体内容(值),形参的初始指(内容)由实参决定.形参在函数(方法)结束返回后就被释放了.

    现在进入主题:参数传递方式分:传值和传址;
    1.传值方式,只是将实参的值的拷贝传递给函数(方法),在方法内对形参进行操作,其对象是实参的拷贝,对实参不能造成影响.在方法结束返回后,形参被释放丢弃,实参的内容并不会改变;

    2.传址方式,将实参的地址传递给函数(方法),在方法内对形参进行操作即等于对实参进行相同的操作,在方法结束返回后,形参同样被释放,实参的内容将会是对形参进行操作的结果.

    而传址方式,又可以细分为:引用传递(pass-by-reference) , 指针传递(pass-by-pointer)

    引用其实就是对象的别名,传对象的引用,用于把一个对象的地址作为参数传过去,而不是对象本身。

    这是我们就明白了前面问题的答案:传递引用,避免了一次实参到形参的拷贝,提高了效率。

    使用引用参数的原因:
    1. 程序员能够修改调用函数中的数据对象

    1. 通过传递引用而不是整个数据对象,可以提高程序的运行速度。

      当数据对象较大时(如结构和类对象),第二个原因最重要,这些也是使用指针参数的原因。这是有道理的,因为引用参数实际上是基于指针的代码的另一个接口。

    那么什么时候使用引用、什么时候使用指针?什么时候又应该按值传递呢?下面是一些指导原则:

    对于使用传递值而不做修改的函数:

    1. 如果数据对象较小,如内置数据类型或者小型结构,则按值传递。

    2. 如果数据对象是数组,则使用指针,因为这是唯一的选择,并将指针声明为指向const的指针。

    3. 如果数据对象是较大的结构,则使用const指针或const引用,以提高运行效率。这样可以节省复制结构所需的时间和空间。

    4. 如果数据对象是类对象,则使用const引用。类设计的语义常常要求使用引用,这是C++增加引用特性的主要原因。因此,传递类对象参数的标准方式是按引用传递。

    对于修改调用函数中数据的函数:

    1. 如果数据对象是内置数据类型,则是用指针。如果看到诸如fixit(&x)这样的代码(其中x是int型),则很明显,该函数将修改x。

    2. 如果数据对象是数组,则只能使用指针。

    3. 如果数据对象是结构,则使用引用或指针。

    4. 如果数据对象是类对象,则使用引用。

    当然,这只是一些指导原则,很可能有充分的理由做出其他的选择。如:对于基本类型,cin使用引用。因此可以使用cin>>n, 而不是cin>>&n 。

    另外找了其他的资料:

    1.

    什么是“引用”?申明和使用“引用”要注意哪些问题?

    引用就是某个目标变量的“别名”(alias),对应用的操作与对变量直接操作效果完全相同。

    申明一个引用的时候,切记要对其进行初始化。引用声明完毕后,相当于目标变量名有两个名称,即该目标原名称和引用名,不能再把该引用名作为其他变量名的别名。声明一个引用,不是新定义了一个变量,它只表示该引用名是目标变量名的一个别名,它本身不是一种数据类型,因此引用本身不占存储单元,系统也不给引用分配存储单元。不能建立数组的引用。

    会调用拷贝构造函数和析构函数

    A a(){…;return *this;}
    A& a(){…;return *this;}
    不会调用拷贝构造函数和析构函数
    应该都能够作为左值

    当返回一个变量时,会产生拷贝。当返回一个引用时,不会发生拷贝,你可以将引用看作是一个变量的别名,就是其他的名字,引用和被引用的变量其实是一个东西,只是有了两个名字而已。

    问题的关键是,当你想要返回一个引用而不是一个拷贝时,你要确保这个引用的有效性,比如:
    int & fun() { int a; a=10; return a; }
    这样是不行的,因为a会在fun退出时被销毁,这时返回的a的引用是无效的。
    这种情况下,如果fun的返回类型不是int & 而是int就没有问题了。

    因此,要返回一个引用时,“临时变量”不能是“临时”的,至少得等函数外部使用完毕这个引用之后,才能销毁它。

    2.返回引用的好处:

    1)传递引用给函数与传递指针的效果是一样的。这时,被调函数的形参就成为原来主调函数中的实参变量或对象的一个别名来使用,所以在被调函数中对形参变量的操作就是对其相应的目标对象(在主调函数中)的操作。

    (2)使用引用传递函数的参数,在内存中并没有产生实参的副本,它是直接对实参操作;而使用一般变量传递函数的参数,当发生函数调用时,需要给形参分配存储单元,形参变量是实参变量的副本;如果传递的是对象,还将调用拷贝构造函数。因此,当参数传递的数据较大时,用引用比用一般变量传递参数的效率和所占空间都好。

    (3)使用指针作为函数的参数虽然也能达到与使用引用的效果,但是,在被调函数中同样要给形参分配存储单元,且需要重复使用”*指针变量名”的形式进行运算,这很容易产生错误且程序的阅读性较差;另一方面,在主调函数的调用点处,必须用变量的地址作为实参。而引用更容易使用,更清晰。

    3 在什么时候需要使用“常引用”?

    如果既要利用引用提高程序的效率,又要保护传递给函数的数据不在函数中被改变,就应使用常引用。常引用声明方式:const 类型标识符 &引用名=目标变量名;

    例1

    int a ;

    const int &ra=a;

    ra=1; //错误

    a=1; //正确

    例2

    string foo( );

    void bar(string & s);

    那么下面的表达式将是非法的:

    bar(foo( ));

    bar(“hello world”);

    原因在于foo( )和”hello world”串都会产生一个临时对象,而在C++中,这些临时对象都是const类型的。因此上面的表达式就是试图将一个const类型的对象转换为非const类型,这是非法的。

    引用型参数应该在能被定义为const的情况下,尽量定义为const 。

    1. 将“引用”作为函数返回值类型的格式、好处和需要遵守的规则?

    格式:类型标识符 &函数名(形参列表及类型说明){ //函数体 }

    好处:在内存中不产生被返回值的副本;(注意:正是因为这点原因,所以返回一个局部变量的引用是不可取的。因为随着该局部变量生存期的结束,相应的引用也会失效,产生runtime error!

    注意事项:

    (1)不能返回局部变量的引用。这条可以参照Effective C++[1]的Item 31。主要原因是局部变量会在函数返回后被销毁,因此被返回的引用就成为了”无所指”的引用,程序会进入未知状态。

    (2)不能返回函数内部new分配的内存的引用。这条可以参照Effective C++[1]的Item 31。虽然不存在局部变量的被动销毁问题,可对于这种情况(返回函数内部new分配内存的引用),又面临其它尴尬局面。例如,被函数返回的引用只是作为一个临时变量出现,而没有被赋予一个实际的变量,那么这个引用所指向的空间(由new分配)就无法释放,造成memory leak。

    (3)可以返回类成员的引用,但最好是const。这条原则可以参照Effective C++[1]的Item 30。主要原因是当对象的属性是与某种业务规则(business rule)相关联的时候,其赋值常常与某些其它属性或者对象的状态有关,因此有必要将赋值操作封装在一个业务规则当中。如果其它对象可以获得该属性的非常量引用(或指针),那么对该属性的单纯赋值就会破坏业务规则的完整性。

    (4)流操作符重载返回值申明为“引用”的作用:

    流操作符<<和>>,这两个操作符常常希望被连续使用,例如:cout << “hello” << endl; 因此这两个操作符的返回值应该是一个仍然支持这两个操作符的流引用。可选的其它方案包括:返回一个流对象和返回一个流对象指针。但是对于返回一个流对象,程序必须重新(拷贝)构造一个新的流对象,也就是说,连续的两个<<操作符实际上是针对不同对象的!这无法让人接受。对于返回一个流指针则不能连续使用<<操作符。因此,返回一个流对象引用是惟一选择。这个唯一选择很关键,它说明了引用的重要性以及无可替代性,也许这就是C++语言中引入引用这个概念的原因吧。赋值操作符=。这个操作符象流操作符一样,是可以连续使用的,例如:x = j = 10;或者(x=10)=100;赋值操作符的返回值必须是一个左值,以便可以被继续赋值。因此引用成了这个操作符的惟一返回值选择。

    例3

    #include

    展开全文
  • C\C++中函数参数的三种传递方式

    千次阅读 2018-07-16 09:07:30
    这种传递方式中,实参和形参是两个不同的地址空间,参数传递的实质是将原函数中变量的值,复制到被调用函数形参所在的存储空间中,这个形参的地址空间在函数执行完毕后,会被回收掉。整个被调用函数对形参的操作,只...
  • C++函数传递参数的方式有哪几种?

    万次阅读 2017-09-04 22:58:51
    C++函数传递参数的方式有以下四种: (1) 值传递  当进行值传递时,就是将实参的值复制到形参中,而形参和实参不是同一个存储单元,所以函数调用结束后,实参的值不会发生改变,程序示例如下: #include using ...
  • C语言函数的参数及传递方式

    万次阅读 2016-05-08 10:37:40
    1.形式参数和实际参数 1.1形式参数 形参出现在被调函数当中,在整个函数体内都可以使用。形参在定义时编译系统并不分配存储空间,只有在调用该函数时才分配内存单元。...传递方式有两种:值传递和地址传
  • C语言函数返回值与参数传递

    千次阅读 2019-10-26 11:57:43
    C语言的函数中必不可少的就是参数传递,可以采用传值和传指针两种方式。 1.传值的形式:只是将参数值的拷贝传给函数,并非参数本体如: int test(int x,int y) { x=2*y; return x; } int main(void) { int a=0,b...
  • C++中函数调用时的三种参数传递方式详解

    万次阅读 多人点赞 2017-08-31 20:44:51
    原文地址:http://blog.csdn.net/cocohufei/article/details/6143476;  ...   在C++中,参数传递方式是“实虚结合”。 按值传递(pass by value) 地址传递(pass by pointer) 引用传递(pass b...
  • Matlab怎样将传递函数转换成差分方程

    千次阅读 多人点赞 2019-12-23 21:14:50
    最近在做毕业设计,自己的控制对象描述形式是传递函数,而书里看到的大部份被控对象都是差分方程的形式,就想有没有这种转换的方法,网上搜索了一圈,总结如下。 步骤一,先建立传递函数方程 首先给定一个连续的传递...
  • 在matlab里.m文件分执行文件和函数文件 在c++中执行文件指:main函数 函数文件:其他所有需要用到的函数 在c++中,函数文件名没有特殊讲究,将文件添加到工程目录便能使用 对函数的要求有三点 函数的完整文件 输入...
  • VBA函数传递参数方式

    万次阅读 2018-03-04 20:58:03
    VBA函数传递参数值时分为Byval(值传递)和Byref(地址传递),用法上,分别相当于C/C++的值传递使用方法和引用传递使用方法。在VBA中,参数传递的默认方式是Byref,因为本质想法是对于相同命名的参数,在系统中采用...
  • 函数参数传递的三种方式

    千次阅读 2019-05-15 20:28:58
    C语言中函数参数传递的三种方式 (1)传值,就是把你的变量的值传递函数的形式参数,实际就是用变量的值来新生成一个形式参数,因而在函数里对形参的改变不会影响到函数外的变量的值。 (2)传址,就是传变量的...
  • 在Java 8中,每个函数都是可以传递的对象,包括静态函数、实例函数与构造函数,唯一需要确认的就是,要传递函数必须与需要的函数签名一致。首先定义函数接口如下:@FunctionalInterface public interface ...
  • c函数传递数组

    千次阅读 2019-07-27 09:38:23
    如果您想要在函数传递一个一维数组作为参数,您必须以下面三种方式来声明函数形式参数,这三种声明方式的结果是一样的,因为每种方式都会告诉编译器将要接收一个整型指针。同样地,您也可以传递一个多维数组作为...
  • 函数参数的两种传递方式

    千次阅读 2020-03-27 19:02:11
    当调用函数时,有两种向函数传递参数的方式: 一、传值调用 该方法把参数的实际值复制给函数的形式参数。在这种情况下,修改函数内的形式参数不会影响实际参数。 默认情况下,C 语言使用传值调用方法来传递参数。...
  • 函数参数传递常用的三种方式

    千次阅读 2019-03-29 08:46:13
    1. 值传递 #include <stdio.h> void swap(int x, int y); void swap(int x, int y) { int temp; temp = x; x = y; y = temp; } int main( int argc, char *argv[] ) { int a = 5; in...
  • c函数传递结构体数组

    千次阅读 多人点赞 2019-08-23 16:35:25
    结构体变量名代表的是整个集合本身,作为函数参数时传递的整个集合,也就是所有成员,而不是像数组一样被编译器转换成一个指针。(结构体变量传递函数与基本变量传递函数类似,可参考c函数传值调用和引用调用) ...
  • python函数的四种参数传递方式

    千次阅读 2018-11-09 16:29:56
    最为灵活,以键值对字典的形式向函数传参,含有第二种位置的灵活的同时具有第三种方式的数量上的无限制。 需要注意: fun2 须在fun1之后, fun3须在fun2之后 ,fun4须在fun3之后 代码演示以及输出: ...
  • C语言中函数参数传递的三种方式

    万次阅读 多人点赞 2017-07-22 21:09:40
    C语言中函数参数传递的三种方式(1)传值,就是把你的变量的值传递函数的形式参数,实际就是用变量的值来新生成一个形式参数,因而在函数里对形参的改变不会影响到函数外的变量的值。(2)传址,就是传变量的地址...
  • shell 函数传递参数的几种方式

    千次阅读 2019-06-27 19:31:00
    1.最近总结了shell中 function的传递变量的几种方式 1.传递单个变量 2.传递数组变量 #!/bin/bash #trying to pass an variable. function func() { echo "The number of parameters is: ${#}" for ...
  • 形参与实参 形参即形式上的参数,对实参的一种抽象类型...传值方式:将实参的值拷贝给函数或方法,在函数内对形参进行操作,操作的对象是实参的拷贝,对实参本身没有影响,在函数结束返回后,形参被丢弃释放,实...
  • react 组件传递函数<MyComponent onClick={this.handleClick}>In React, there are several cases where you may want to pass a function (like onClick) as a prop from a container to a child component ...
  • c函数传递字符串

    千次阅读 2019-08-23 16:13:31
    把具有相同类型的若干变量按有序的形式组织起来,这些按序排列的同类数据...由此可得:在函数中传递一个字符串与传递一个数组类似,可参考c函数传递数组 一 形式参数 在函数中传递一个字符串作为参数,以下面三...
  • 并且如果函数传递的是类的对象,系统还会调用类中的拷贝构造函数来构造形参对象。而 使用引用作为函数的形参时,由于此时形参只是要传递给函数的实参变量或对象的别名而非副本,故系统不会耗费时间来在内存中开辟...
  • MATLAB 传递函数的相关函数

    千次阅读 多人点赞 2019-06-17 23:15:57
    1. 连续时间传递函数 1.1 多项式形式传递函数 num = 1; % 分子多项式的系数 den = [2, 3]; % 分母多项式的系数 G = tf(num, den) % 求传递函数 在matlab中,运行上述代码,可以得到传递函数 1.2 因式乘积形式...
  • 函数参数传递的两种方式——值传递和引用传递

    万次阅读 多人点赞 2018-10-23 15:50:05
    传递包括实实在在的值传递以及指针传递(指针传递参数本质上是值传递方式,它所传递的是一个地址值),传递的都是实参的一个拷贝。 1、实实在在的“值”传递 #include &lt;iostream&gt; #include &...
  • c语言 向函数传递数组

    千次阅读 2020-04-11 19:23:43
    可以定义一个能接受数组作为函数参数的函数,然后调用这个函数时,可以将一个实际的数组传递给它。 数组作为函数参数时,其定义方式有下列三种: /*函数名param后跟一个空的[],说明param可以接受一个数组*/ void ...
  • 函数传递结构体

    千次阅读 2017-05-29 23:05:06
    函数传递结构体 结构体指针变量做函数参数实现传值调用 */ 运行结果: #include struct date {  int year;  int month;  int day; }; void func(struct date *pt) //结构体指针变量做...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,504,943
精华内容 601,977
关键字:

函数传递方式