精华内容
下载资源
问答
  • 1.值传递和指针传递 (1)值传递:即按值传递参数,是将实参变量的值复制一个到临时存储单元中,如果在调用过程中改变了形参的值,不会影响实参变量本身,即实参变量保持调用前的值不变 ...

    1.值传递和地址传递

      (1)值传递:即按“值(如数字10)”传递参数,是将实参变量的值复制一个到临时存储单元中(该存储单元会随着调用的函数运行结束而释放掉),如果在调用过程中改变了形参的值,不会影响实参变量本身,即实参变量保持调用前的值不变

     (2)地址传递:即按“地址(如0019FEDC)”传递参数,把实参变量的地址传送给被调用函数,形参和实参共用内存的同一地址。在被调用过程中,形参的值一旦改变,相应实参的值也跟着改变

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

    举栗子:

    ①值传递(普通类型变量的参数传递)
    void fun1(int a){
        a=2;
        printf("在fun1函数中,变量a值的地址是:%p\n",&a);
        a=a+1;
    }
    void main(){
        int n=1;
        printf("在main函数中,变量n的地址是:%p\n",&n);
        fun1(n);
        printf("fun1函数中形参a加1之后,实参n的值是%d\n",n);//n的值任然不变还是1
    }

    运行结果

    ②地址传递(指针作为参数)

    void fun2(int *q){
        printf("在fun2函数中q的值是(和m的地址,p的值一样):%p\n",q);
        *q=*q+5;
    }

    void main(){
        int m=10;
        int *p=&m;
        printf("在main函数中,m值的地址:%p\n",&m);
        printf("在main函数中,p指针的值(p所指向变量的地址):%p\n",p);
        printf("在main函数中,p指针的地址(指针变量本身也要占存储单元):%p\n",&p);
        fun2(p);//传的是p的值,该值是m的地址
        printf("执行fun2函数后,m的值是(由于形参和实参共用内存的同一地址,形参改变实参也改变):%d\n",m);
    }

    注:当 “ * ” 有两个作用 。作用一(定义指针变量):int *p;   作用二(取值):int m=10;  int p=&m;  printf(*p)//输出10

    运行结果

    ③数组名的参数传递

    “数组名的值”和数组的地址都存储了数组的首地址

    void fun3(int arr[]){
        for(int i=0;i<5;i++){
            printf("%d",arr[i]);
        }
    }
    void fun4(int *arr){
        for(int i=0;i<5;i++){
            printf("%d",arr[i]);
        }
    }

    void main(){

            int arr[5]={1,3,5,7,9};
            int*r;
            r=arr;
            fun3(arr);//传数组名
            printf("\n");
            fun4(r);//传递指针
            printf("\n");
            printf("数组名的值:%p\n",arr);
            printf("数组的地址值:%p\n",&arr);
    }

    运行结果

    展开全文
  • C语言函数参数传递过程

    千次阅读 2019-05-19 13:34:30
    X86平台:函数参数传递使用堆栈来实现,从右向左压栈(_stdcall方式和_cdcel)。【_fastcall方式:左边开始的两个不大于4字节(DWORD)的参数分别放在ECX和EDX寄存器,其余的参数仍旧自右向左压栈传送】 X64平台:...

    不同的平台或者相同的平台不同的编译选项,参数入栈的方式不一样。

    X86平台:函数参数传递使用堆栈来实现,从右向左压栈(_stdcall方式和_cdcel)。【_fastcall方式:左边开始的两个不大于4字节(DWORD)的参数分别放在ECX和EDX寄存器,其余的参数仍旧自右向左压栈传送】

    X64平台:前四个参数存放在寄存器中传递,剩余参数则压入堆栈中。

    ARM平台:前四个整型参数使用R0,R1,R2,R3传递。多余四个的参数使用下降式堆栈传递。C++中,一个对象方法的第一个参数总是this指针。这个参数是隐式的。因此C++显示参数少于三个,函数执行快。当参数多余4个的时候,可以将其他变量存放在一个结构体中,传递一个结构体指针。

     

    参考:https://www.cnblogs.com/jueyunqi/p/4140141.html

    编译器一般采用从右到左入栈的原因:

    1. 可以保证参数入栈后相对于栈指针的位置偏移量是固定的,应为参数数量不确定,第一个参数最靠近栈指针,无论参数个数是多少,第一个参数相对于SP的位置是固定的。
    2. 有了1,所以函数可以支持可变长参数的函数。

     

     

     

    ARM架构规定:

    ATPCS规则体现了一种模块化设计的思想,其基本内容是C模块(函数)
    和汇编模块(函数)相互调用的一套规则(C51中也有类似的一套规则)。
    我感觉比在线汇编功能强大(不用有很多忌讳),条理更清楚(很简单的几条
    规则)
    规则内容
    一.被调用模块的寄存器使用
       1.调用模块和被调用模块通过R0-R3传递参数,因此参数少于四个时可以随意
         使用剩余的而不必保存和恢复
       2.使用R4-R11之前一定要先在堆栈中保存起来,退出时再恢复
       3.可以使用堆栈,但一定要保证堆栈指针(R13)在进入时和退出时相等
       4.R14用于保存返回地址,使用前一定要备份
    二.被调用模块的堆栈使用
       ATPCS规则规定堆栈是满递减(fD)型的,因此使用STMFD/LDMFD指令操作,
       注意保证进入和退出时堆栈指针相等
    三.参数传递
       当少于四个时,按从左到右的顺序依次放在r0,r1,r2,r3中;
       当多于四个时,前四个放在r0,r1,r2,r3中,剩余的放在堆栈中,最后一个
       参数先入栈,第五个参数最后入栈,即从右到左入栈
    四.返回值
       结果为32位时,通过R0返回
       结果为64位时,r0放低32位,r1放高32位
     

     

     

    展开全文
  • 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语言函数参数传递原理

    千次阅读 2014-07-29 10:34:19
    这次,我们只是详细描述一下第一种参数传递方式,另外一种方式在这里不做详细介绍。 首先,我们看一下,下面一个简单的调用例程: int Add (int a, int b, int c) { return a+b+c; } void main() { int x =0 , y =...

    C语言中参数的传递方式一般存在两种方式:一种是通过栈的形式传递,另一种是通过寄存器的方式传递的。这次,我们只是详细描述一下第一种参数传递方式,另外一种方式在这里不做详细介绍。

    首先,我们看一下,下面一个简单的调用例程:

    int Add (int a, int b, int c)

    {

    return a+b+c;

    }


    void main()

    {

    int x =0 , y = 1, z = 2;

    int result = 0;

    result = Add(x, y, z);

    printf("Result for x+y+z %d", result);

    }

    借助以上例程,我们具体看一下,参数是如何传递的。首先,我们了解一个知识点,就是“()”操作符在C语言中有很多含义,比如说,结合符、函数调用符等。那么在result = Add(x,y,z)语句中当然为函数调用符,因此在编译阶段,遇到函数调用符后的执行序为,从最后一个参数开始压栈,压栈顺序为z->y->x, 直到将全部的参数压到调用栈中,然后call到Add对应的函数地址开始执行。那么压栈执行完成后,栈空间,从上到下依次的顺序为x->y->z(因为栈的生长方向为向上,即地址低的地方,因此,x在地址最低的地方,即栈顶)。因此,在被调用函数中参数的读取和操作也都是发生在栈中的。

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

    万次阅读 2013-12-29 20:16:31
    传递,即按值传递参数,按值传递参数时,是将实参变量的值复制一个到临时存储单元中,如果在调用过程中改变了形参的值,不会影响实参变量本身,即实参变量保持调用前的值不变。 1、形参只能是变量,实参可以是常量...
  • C语言中结构体作为函数参数,有两种方式:传值和传址。 1.传值时结构体参数会被拷贝一份,在函数体内修改结构体参数成员的值实际上是修改调用参数的一个临时拷贝的成员的值,这不会影响到调用参数。在这种情况下,...
  • 问题描述:函数参数传递的三种表示方式 输入描述:输入两个整数 程序输出:调换位置 #include void myswap(int x, int y) {  int t;  t=x;  x=y;  y=t; } int main() {  int a,
  • C语言函数参数传递详解

    千次阅读 多人点赞 2019-03-31 15:04:54
    二、函数参数传递方式之一:值传递 (1)值传递的一个错误认识 先看考题一中Exchg1函数的定义: void Exchg1(int x, int y) /* 定义中的x,y变量被称为Exchg1函数的形式参数 */ { int tmp; tmp = x; x = y; y...
  • C语言函数返回值与参数传递

    千次阅读 2019-10-26 11:57:43
    C语言函数返回值与参数传递 一:参数传递 C语言的函数中必不可少的就是参数传递,可以采用传值和传指针两种方式。 1.传值的形式:只是将参数值的拷贝传给函数,并非参数本体如: int test(int x,int y) { x=2*y; ...
  • *问题描述:c语言函数参数传递的两种方式 * */ #include &amp;lt;stdio.h&amp;gt; void swap1(int x, int y); //对交换函数myswap1的提前声明 (传值) void swap2(int *p1, int *p2); //对交换函数...
  • C语言函数参数传递的注意事项

    千次阅读 2014-04-07 17:34:25
    C语言函数参数传递方式有纯地质
  • C语言函数参数传递的方式:值传递,地址传递 ** 值传递:将实参的值复制至形参的相应存储单元中,实参与形参占用不同存储单元,单向传递 地址传递:使用数组名或者指针作为函数参数,传递的是该数组的首地址或指针...
  • C语言函数参数传递的三种方式

    万次阅读 多人点赞 2017-07-22 21:09:40
    C语言函数参数传递的三种方式(1)传值,就是把你的变量的值传递给函数的形式参数,实际就是用变量的值来新生成一个形式参数,因而在函数里对形参的改变不会影响到函数外的变量的值。(2)传址,就是传变量的地址...
  • C语言函数参数可以按照以下两种方式进行传递:1.按值传递: 按值传递参数时,它们的值是通过临时变量传递的,所以函数中变量值的改变,不会影响到主调程序中变量的值2.按地址传递: 按地址传递时,函数的参数一定是...
  • 当一个表达式作为参数传递函数时,这个表达式将首先进行求值,然后把结果传递给函数。 作为参数传递函数的变量在调用环境中并不会被修改。 #include int main(void) { int a=1; void try_to_change_it...
  • 也就是本例中 将int [10]类型退化为 int *类型,同时这种做法也避免了参数传递中的复制数组的巨大开销(如果数组长度很大的话)。 当然,这样也就起不到对参数进行保护的作用了,因为传递进去的是指针。
  • C语言函数参数是如何传递的?

    千次阅读 2019-06-24 14:36:24
    我们可能听过C语言中的传值和传指针,在其他语言中,也有传引用一说,那么他们到底有什么区别呢?如果你还不能准确地分辨,就该好好了解一下了。 传值 我们在初学C语言的时候就被老师教过,下面的方式是无法交换a...
  • C语言函数传递指针参数的问题

    万次阅读 多人点赞 2016-11-28 12:14:18
    一个问题是,我们想用一个函数来对函数外的变量v...如果你真的理解C语言中【函数】这个工具的本质,我想你稍微仔细的思考一下,可能就不会来查看博主的这篇文章,对函数来说,它所传递的任何参数仅仅是原来参数的一...
  • C语言函数传递方式-值传递和地址传递

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

    千次阅读 2005-12-19 11:37:00
    C语言函数参数可以按照以下两种方式进行传递:1.按值传递: 按值传递参数时,它们的值是通过临时变量传递的,所以函数中变量值的改变,不会影响到主调程序中变量的值2.按地址传递: 按地址传递时,函数的参数一定是...
  • c语言 函数参数传递示例 C ++ lround()函数 (C++ lround() function) lround() function is a library function of cmath header, it is used to round the given value and casts to a long integer, it accepts ...
  • c语言函数参数传递机制

    千次阅读 2016-12-16 23:57:01
    看《深入理解计算机系统》觉得深入理解了函数之间的参数传递,但是今天一写代码就出错了。 函数对接收进来的参数都会在自己的运行时间和空间内(栈段和寄存器)有一个拷贝,所有都是,指针也是,只不过指针指向地址...
  • C语言 函数参数和调用函数

    千次阅读 2019-04-14 08:39:07
    当调用函数时,有两种向函数传递参数的方式: 传值调用 默认情况下,C 语言使用传值调用方法来传递参数。一般来说,这意味着函数内的代码不会改变用于调用函数的实际参数函数 swap() 定义如下: /* 函数定义 */ ...
  • c语言 函数参数传递示例Define a function with no argument and no return type in C language. 用C语言定义一个没有参数且没有返回类型的函数。 In the program, we have function named fun1 which has no ...
  • 若用函数调用的方式来实现交换,沿用上述思路初步实现如下: #include&lt;stdio.h&gt; void exchange(int,int); void exchange(int one,int another){ int t; t = one; one = another; anoth...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 128,627
精华内容 51,450
关键字:

c语言函数参数传递

c语言 订阅