精华内容
下载资源
问答
  • 首先, C语言里不存在引用传递的方式(注释掉的ex3,编辑就过不了).习惯说的按值传递和地址传递实质上都是值传递,只不过前者传的是int值,后者传的是指针值.看代码就一目了然了.//// main.c// exchange//// Created by ...

    C语言函数传参到底有几种?!

    就一种, 按值传递!

    首先, C语言里不存在引用传递的方式(注释掉的ex3,编辑就过不了).

    习惯说的按值传递和地址传递实质上都是值传递,只不过前者传的是int值,后者传的是指针值.

    看代码就一目了然了.

    //

    // main.c

    // exchange

    //

    // Created by cbd on 16/8/16.

    // Copyright © 2016年 cbd. All rights reserved.

    //

    #include

    void ex1(int, int);

    void ex2(int *, int *);

    int main(int argc, const char * argv[]) {

    int a = 4;

    int b = 6;

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

    ex1(a, b);

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

    int aa = 44;

    int bb = 66;

    printf("originally,aa:%d,bb:%d\n",aa,bb);

    ex2(&aa, &bb);

    printf("finally,aa:%d,bb:%d\n\n",aa,bb);

    return 0;

    }

    void

    ex1(int x, int y){

    int temp = x;

    x = y;

    y = temp;

    printf("ex1按值传递, x:%d,y:%d\n", x, y);

    }

    void

    ex2(int *x, int *y){

    int temp = *x;

    *x = *y;

    *y = temp;

    printf("ex2地址传递, x:%d,y:%d\n", *x, *y);

    }

    /*

    c 语言没有引用传递

    void

    ex3(int &x, int &y){

    int temp = x;

    x = y;

    y = temp;

    printf("ex3引用传递, x:%d,y:%d\n", x, y);

    }

    */

    结果输出

    originally,a:4,b:6

    ex1 值传递, x:6,y:4

    finally,a:4,b:6

    originally,aa:44,bb:66

    ex2地址传递, x:66,y:44

    finally,aa:66,bb:44

    Program ended with exit code: 0

    展开全文
  • C语言函数参数传递的两种方式:值传递和引用传递1 值传递1.1 实实在在的值传递1.2 指针传递2 引用传递3 字符串变量的函数传递与指针传递3.1 错误示范参考 1 值传递 值传递包括实实在在的值传递和指针传递,指针传递...

    1 值传递

    值传递包括实实在在的值传递和指针传递,指针传递参数本质上是值传递的方式,它所传递的是一个地址值,传递的都是实参的一个拷贝。

    1.1 实实在在的值传递

    #include <iostream>
    #include <vector>
     
    using namespace std;
     
    void function(int num){
    	//改变num的值
    	num = 100;
    }
     
    int main()
    {
    	int number;
    	number = 1;
    	function(number);
    	cout << number << endl;
    	return 0;
    }
    

    这样的值传递只能把一个函数中的值传递给另一个函数,当该值在被调函数中发生改变时,在原来的函数中并不会发生改变。因为被调函数的型参只有函数被调用的时候才会临时分配单元,一旦调用结束,占用的内存便会释放,所以调用的函数中存储number的地址跟被调函数中number的地址不一样。

    如果想让number通过被调函数改变该怎么做?第一种是使用指针形式的值传递,第二种是使用引用传递。

    1.2 指针传递

    指针传递是通过地址间接的改变了实参的值。

    #include <iostream>
    #include <vector>
     
    using namespace std;
     
    void function(int* num){
    	//通过改变num对应地址的值来实现值的改变:
    	//形参num是一个指针,传递过来的是一个地址值,解引用即可访问到这个地址值映射的值
    	*num = 100;
    }
    
    int main()
    {
    	int number;
    	number = 1;
    	function(&number);
    	cout << number << endl;
    	return 0;
    }
    

    2 引用传递

    对引用的操作等于是对其指定的对象进行操作,当将实参传递给形参时,形参就指向了实参(形参与实参同义,是实参的一个别名)。

    #include <iostream>
    #include <vector>
     
    using namespace std;
     
    void function(int& num){
    	//通过引用改变num的值
    	num = 100;
    }
     
    int main()
    {
    	int number;
    	number = 1;
    	function(number);
    	cout << number << endl;
    	system("pause");
    	return 0;
    }
    

    3 字符串变量的函数传递与指针传递

    重点: 要想用指针传递,通过函数改变主函数中字符串指针变量的值,必须使用char**的二级指针。

    3.1 错误示范

    先举个例子

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    void func(char* dst)
    {
            char* buf = (char*)malloc(20);
            memset(buf, 0, 20);
            strcpy(buf, "hello world!");
            dst = buf;
            puts(dst);
    }
    
    int main()
    {
            char* s = "123456";
            func(s);
            puts(s);
            return 0;
    }
    /*
    本来想通过func函数改变s的值,结果并没有改变,还是输出123456
    */
    

    因为以前值传递和指针传递时用的例子是整型变量,指针传递时用一级指针就可以通过函数改变主函数中的变量的值。

    换成字符串变量,咋一看也是一级指针。

    但是你要明白: 字符串指针的定义是什么? char* schar* 本来就仅仅是一个字符串指针变量的类型! s存的是一个字符串的首地址值,所以你要通过函数改变字符串指针变量的值,就得用char**二级指针!

    3.2 正确姿势

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    void func(char **dst) {
        char *buf = (char *) malloc(20);
        memset(buf, 0, 20);
        strcpy(buf, "hello world!");
        *dst = buf;
        //puts(dst);
    }
    
    int main() {
        char *s = "123456";
        func(&s);
        puts(s);
        return 0;
    }
    

    参考

    1. https://blog.csdn.net/qq_28584889/article/details/83307592
    2. https://blog.csdn.net/qq_28584889/article/details/93789577
    展开全文
  • C语言参数传递方式

    千次阅读 2007-04-05 22:28:00
    很多教材上说:C语言参数传递方式有传值调用和传址调用,真是瞎掰~C语言参数传递方式只有传值调用一种!最简单的就是:void fun1(int a);这是传值调用void fun2(int *a);//这也是传值调用,不知道为什么要说它是...

    很多教材上说:C语言的参数传递方式有传值调用和传址调用,真是瞎掰~

    C语言的参数传递方式只有传值调用一种!

    最简单的就是:void fun1(int a);这是传值调用

    void fun2(int *a);//这也是传值调用,不知道为什么要说它是传址。

    传递的参数类型是个 int*,一样是值复制传递,在fun2中,你无法修改a的值(或者说,你在函数修改a的值,并不会影响实参a的值),你可以修改的,仅仅是参数a指向的内存里存放的值,而不是参数本身,所以,这也是一种传值调用(形参不改变实参)。

    当然,C++多了个传引用。

    展开全文
  • C语言函数参数传递的分析

    万次阅读 2013-12-29 20:16:31
    传递,即按值传递参数,按值传递参数时,是将实参变量的值复制一个到临时存储单元中,如果在调用过程中改变了形参的值,不会影响实参变量本身,即实参变量保持调用前的值不变。 1、形参只能是变量,实参可以是常量...

    一、值传递和指针传递的概念

    (一)值传递

    值传递,即按值传递参数,按值传递参数时,是将实参变量的值复制一个到临时存储单元中,如果在调用过程中改变了形参的值,不会影响实参变量本身,即实参变量保持调用前的值不变。

    1、形参只能是变量,实参可以是常量、变量或表达式。在被定义的函数中,必须指定形参的类型。

    2、实参与形参的个数应一样,类型应一致。字符型和整型可以互相通用。

    4、实参传递给形参是实参的值,形参变量在未出现函数调用时,并不占用内存,只在调用时才占用。调用结束后,将释放内存。值传递过程中参数的数据传递是单向的,数据(实参的值)从实参传递形参,而不能由形参传回实参。执行一个被调用函数时,形参的值如果发生改变,并不会改变主调函数中的实参的值。

    4、形参如同公式中的符号,实参就是符号具体的值,在调用过程前必须得到赋值;调用过程就是实现形参与实参的结合,把实参的值通过调用传递给形参,相当于把值代入公式进行计算。值传递的本质就是表达式。

    (二)地址传递

    地址传递,即按地址传递参数,按地址传递参数时,把实参变量的地址传送给被调用过程,形参和实参共用内存的同一地址。在被调用过程中,形参的值一旦改变,相应实参的值也跟着改变。

    1、实参必须是是变量,也就是保证可以重新被赋值或者初始化。在被定义的函数中,必须指定形参的类型。

    2、实参与形参的个数应一样,类型应一致。字符型和整型可以互相通用。

    3、实参传递给形参的是实参变量的地址,函数调用过程中,并不为形参开辟存储空间,也就是说地址传递过程中形参和实参共用实参的存储空间,对形参的操作就是对实参本身的操作。

    (三)值传递,地址传递的区别

    1、值传递实参向形参传递的是实参的值,而地址传递传递的却是实参的地址。

    2、值传递在函数调用过程中会为形参重新开辟空间,形参与实参分别占用不同的地址空间,而地址传递,形参和实参共用同一内存地址。

    我们在参数传递过程中,只要抓住这两点区别,就很好区别参数传递的具体方式。

    二、C语言函数参数的传递规律

    下面我们将从形参和实参是普通类型变量、指针变量、数组名时分别讨论参数的传递方式。

    (一)普通类型变量的参数传递

    简单类型变量作实参,形参对应为类型一致的简单类型变量,请看下面的程序

    void fun_of_value(int par_value)
    {
    printf("In function, the Address of the VALUE = %p\n", &par_value);
    printf("In function, the Value of the VALUE = %d\n\n\n", par_value);
    }
    int main(void)
    {
    int arg_value = 10;
    printf("In main, the Address of the VALUE = %p\n", &arg_value);
    printf("In main, the Value of the VALUE = %d\n", arg_value);
    fun_of_value(value);
    printf("After function, the Address of the VALUE = %p\n", &arg_value);
    printf("After function, the Value of the VALUE = %d\n", arg_value);
    }

    我们在主程序和函数中分别打印实参arg_value和形参par_value的地址和值,下面是程序在Code::Block12.11中的运行结果

    In main, the Address of the VALUE = 0028feec
    In main, the Value of the VALUE = 10
    In function, the Address of the VALUE = 0028fed0
    In function, the Value of the VALUE = 10

    简易的内存图示如下:


    很显然在参数传递的过程中,实参arg_value和形参par_value具有相同的值,但是占用的存储单元不相同,在函数中对形参的运算,对实参没有影响,说明简单类型变量在参数传递过程中是单向值传递的。

     

    (二)指针变量的参数传递

    1、普通指针的作为参数

    void fun_of_point(int *par_point)
    {
    printf("In function, the Address of the POINT = %p\n", &par_point);
    printf("In function, the Value of the POINT = %p\n\n\n", par_point);
    }
    int main(void)
    {
    int  value = 10;
    int *arg_point = &value;
    printf("The Addreess of the value = %p\n", &value);
    printf("In main, the Address of the POINT = %p\n", &arg_point);
    printf("In main, the Value of the POINT = %p\n", arg_point);	 // 打印参数的值
    fun_of_point(point);
    return EXIT_SUCCESS;
    }
    同样我们在主程序和函数中分别打印实参arg_value和形参par_value的地址和值,下面是程序在Code::Block12.11中的运行结果

    The Addreess og the value 0028feec
    In main, the Address of the POINT = 0028fee8
    In main, the Value of the POINT = 0028feec
    In function, the Address of the POINT = 0028fed0
    In function, the Value of the POINT = 0028feec

    对结果分析后的图示如下:


    指针存储的值其实是变量value的地址,我们发现,当参数是普通指针类型的时候,形参和实参都存储着变量value的地址,也就是值相同,但是他们本身所占用的存储单元却不相同,即不共用存储空间,我们不难得出当参数类型是普通指针变量时,参数传递也是值传递,只是传递的值是地址(实参的值),并不是“地址传递”。

     

    2、函数指针的参数

    void function(void){}
    void fun_of_fun_point(void(*par_pfun)(void))
    {
    printf("In function, the Address of the FUNCTION = %p\n", &par_pfun);
    printf("In function, the Value of the FUNCTION = %p\n\n\n", par_pfun);
    }
    int main(void)
    {
    void (*arg_pfun)(void);
    arg_pfun = /*&*/function;
    printf("The Address of the FUNCTION = %p\n", function);
    printf("In main, the Address of the FUNCTION = %p\n", &arg_pfun);
    printf("In main, the Value of the FUNCTION = %p\n", arg_pfun);
    fun_of_fun_point(arg_pfun);
    return EXIT_SUCCESS;
    }


    运行结果如下:

    The Address of the FUNCTION = 004016c9
    In main, the Address of the FUNCTION = 0028feec
    In main, the Value of the FUNCTION = 004016c9
    In function, the Address of the FUNCTION = 0028fed0
    In function, the Value of the FUNCTION = 004016c9
    对结果分析后的图示如下:


      与前面采取的方式类似,以函数指针作为参数与普通指着一样,实参与形参都存储了原函数的地址,但是他们本身的所占用的存储单元并不相同,可见此时参数传递方式仍然是值传递,传递的值是函数function的地址。

    (三)数组名的参数传递

    void fun_of_array(int array[])
    {
    printf("In function, the Address of the ARRAY = %p\n", &array);
    printf("In function, the Value of the ARRAY = %p\n", array);
    }
    void fun_of_array_point(int *array)
    {
    printf("In function, the Address of the ARRAYPOINT = %p\n", &array);
    printf("In function, the Value of the ARRAYPOINT = %p\n", array);
    }
    int main(void)
    {
    int array[10];
    printf("The Addres of the first value %p\n", &array[0]);
    printf("In main, the Address of the ARRAY = %p\n", &array);
    printf("In main, the Value of the ARRAY = %p\n", array);
    fun_of_array(array);
    fun_of_array_point(array);
    return EXIT_SUCCESS;
    }


    程序的运行结果如下:

    The Addres of the first value 0028fec8
    In main, the Address of the ARRAY = 0028fec8
    In main, the Value of the ARRAY = 0028fec8
    In function, the Address of the ARRAY = 0028feb0
    In function, the Value of the ARRAY = 0028fec8
    In function, the Address of the ARRAYPOINT = 0028feb0
    In function, the Value of the ARRAYPOINT = 0028fec8
    我们不难看出,数组的地址和“数组名的值”(我们暂且这样称呼)都存储了数组的首地址,其实大多数编译器(如gcc)在处理的时候会在预处理阶段把数组名类型的参数转换为指针类型的参数进行处理的,在编译器看来,在以数组名作为参数的时候数组参数本质上为指针参数,即数组参数和指针参数是完全等价的两种形式

    因此以数组名作为参数,本质上也是指针类型的参数传递,也采用单向值传递的方式。

    三 总结

    由此我们不难得出结论,C语言函数的所有参数传递均以“按值传递”(单向值传递)方式进行,在函数内部将获得与形式参数值相同的一份数据拷贝,函数的参数传递采用单向的值传递方式。当指针作为函数参数时,传递值是指针的值,即地址,依然是单向的值传递方式,并不是双向的数据传递方式。

    注意:引用传递是C99新引入的参数传递机制,但是目前为止,仍没有一款编译器完全支持C99标准,因此引用传递在此不进行讨论,但是通过对资料的研究,其实引用传递本质也是采用指针传递的机制来实现的。

     

     

    展开全文
  • C语言参数传递类型

    千次阅读 2016-09-22 16:10:12
    四、函数参数传递方式之三:引用传递 看题三的代码: void Exchg3(int &x, int &y) /* 注意定义处的形式参数的格式与值传递不同 */ {  int tmp = x;x = y;  y = tmp;  printf("x = %d, y = %d.\n", x...
  • 区分C语言C++的值传递引用传递,实际程序代码分析,帮助弄懂二者的差异性
  • 主要介绍了C语言中的参数传递机制,C语言中函数参数的传递有:值传递、地址传递、引用传递这三种形式。下面我们详细探讨下
  • 汇编向C语言参数传递的问题

    千次阅读 2018-12-08 23:57:38
    C语言与汇编语言混合编程应遵守的规则 ARM编程中使用的C语言是标准C语言,ARM的开发环境实际上就是嵌入了一个C语言的集成开发环境,只不过这个开发环境与ARM的硬件紧密相关。 在使用C语言时,要用到和汇编语言的混合...
  • c语言 引用参数

    2010-02-20 09:12:23
    引用参数 har * fun(char *p) { return p; } 提问:此函数返回的是谁的值,是参数p的地址,还是p的值? 回答: ************************************************************ -----------...
  • C语言参数传递----值传递与地址传递

    千次阅读 多人点赞 2017-09-15 23:32:58
    最近开始复(yu)习(xi)C语言,看到参数传递这里,又遇到了以前一直没有搞清楚的一个问题,我相信这个问题大家许多初学者也会遇到过,就是C语言函数的参数传递方式。 C语言中参数的传递有两种方式: 1)值传递 ...
  • C语言中结构体作为函数参数,有两种方式:传值和传址。 1.传值时结构体参数会被拷贝一份,在函数体内修改结构体参数成员的值实际上是修改调用参数的一个临时拷贝的成员的值,这不会影响到调用参数。在这种情况下,...
  • C语言参数传递方式: 值传递(swap1函数) 地址传递(swap2函数) 引用传递(swap3函数) #include<stdio.h> #include<windows.h> void swap1(int,int); //值传递 void swap2(int *p1,int *p2); ...
  • C语言参数传递——值传递与地址传递 值传递 int main(){ int a=3; int b=4; printf("初始值a=%d,b=%d\n",a,b); exchange(a,b); printf("运行后a=%d,b=%d",a,b); return 0; } void exchange(int a ,int b){ ...
  • 问题描述:函数参数传递的三种表示方式 输入描述:输入两个整数 程序输出:调换位置 #include void myswap(int x, int y) {  int t;  t=x;  x=y;  y=t; } int main() {  int a,
  • C语言中的参数传递

    2015-09-19 09:35:00
    有空看看: c语言 函数传输传递的三种方式(值、指针、引用) C语言参数传递 C语言形参和实参,传值调用和引用调用的区别 转载于:https://www.cnblogs.com/heyijing/p/4820928.html...
  • C语言参数传递

    千次阅读 2010-11-06 10:36:00
    C语言参数传递方式有两种:值传递和地址传递(或指针传递)。 值传递: (1)采用值传递方式传递的变量(形参)是实参的“拷贝”,是函数的局部变量。 (2)函数结束后,局部变量虽然达到预期的...
  • 函数参数传递方式之一:值传递  1. 值传递的一个错误认识 voidExchg1(int x, int y) //定义中的x,y变量被称为Exchg1函数的形式参数 {  int tmp;  tmp=x;  x=y;  y=tmp;  printf(“x=%d,y=%d/n”,x,y
  • 首先,C语言没有引用传递。 C++中使用引用传递的方式是在函数的参数前加&号,如: void Delete_X(LinkList &L, ElemType x) // 声明 Delete_X(L, 45); // 使用 C:指针作为参数传入函数中时,是值传递 ...
  • C语言中函数参数传递的方式:值传递,地址传递 ** 值传递:将实参的值复制至形参的相应存储单元中,实参与形参占用不同存储单元,单向传递 地址传递:使用数组名或者指针作为函数参数,传递的是该数组的首地址或指针...
  • C语言指针作为参数传递问题

    千次阅读 2021-06-30 14:28:36
    (注意:C语言中没有引用传递,C++才有引用传递,因为很多C语言环境是用C++编译器编译,使得C看起来支持引用传递,导致很多网上很多blog都把引用传递归为C语言参数传递的一类, 当使用Microsoft Visual C++ 2010 ...
  • 并且,这表明C语言的数组作为参数传递给函数时,是作为引用方式传递的。 还有,在传递的时候,还需要把数组的大小也一并传递给函数。因为只传递数组给函数,进而想要在函数中获得数组大小,在网上搜了一下,答案居然...
  • C语言函数返回值与参数传递

    千次阅读 2019-10-26 11:57:43
    C语言函数返回值与参数传递 一:参数传递 C语言的函数中必不可少的就是参数传递,可以采用传值和传指针两种方式。 1.传值的形式:只是将参数值的拷贝传给函数,并非参数本体如: int test(int x,int y) { x=2*y; ...
  • C语言,Java中值传递引用传递传递引用传递一、什么是值传递引用传递二、详细解释值传递引用传递1.C语言中的值传递和地址传递2.java中的值传递引用传递总结 值传递引用传递 文章目录值传递引用传递...
  • 函数参数传递的两种方式为值传递和引用传递 1.传值方式传参 c语言是按值传递的,在函数中被传递的参数的本身(实参)是不能被修改的!参数x传进去的时候会被复制了一份copy,此后的修改都是在临时变量copy上,出了...
  • 传递 地址传递 引用传递 https://blog.csdn.net/u013097971/article/details/77983810  
  • c语言参数传递问题

    2013-11-06 20:56:52
    n),编译时提示LinkList &L传参错误,不能按引用传参(C语言没有按引用传参),然后就把&去掉,编译通过,但是运行错误。后来想了想原因,我不能把&去掉,如掉的话就是按值传递,CreatList函数里面的链表构建就跟L...
  • C语言参数传递的三种方式

    千次阅读 2020-09-04 14:11:38
    C语言中函数参数传递的三种方式 (1)传值,就是把你的变量的值传递给函数的形式参数,实际就是用变量的值来新生成一个形式参数,因而在函数里对形参的改变不会影响到函数外的变量的值。 (2)传址,就是传变量的...
  • c语言不支持函数引用传递参数

    千次阅读 2016-09-19 17:13:19
    看内核代码看得非常昏,越看越发现自己c语言基础不扎实,今天写了印象中的三种函数参数传递方式,脑海里一直印象中c语言中是支持引用的,结果发现编译报错,百度一下发现竟然不支持引用传递!!!!!!!!!!!...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 72,029
精华内容 28,811
关键字:

c语言引用参数传递

c语言 订阅