精华内容
下载资源
问答
  • C语言函数参数入栈顺序从右到bai左是为了方便可变参数du函数。 一、在函数调用时,函数参数的传递,在C语言中是通过栈数据结构实现的。 在调用函数时,先根据调用函数使用的参数,自右向左依次压入栈中,然后调用...

    C语言函数参数入栈顺序从右到左是为了方便可变参数函数。
    一、在函数调用时,函数参数的传递,在C语言中是通过栈数据结构实现的。
    在调用函数时,先根据调用函数使用的参数,自右向左依次压入栈中,然后调用函数,在函数开始执行时,将参数再依次弹栈。根据栈数据结构先进后出的特点,在函数中弹栈的顺序就是从左向右的。
    二、对于参数固定的函数,无论是从左向右还是从右向左,都没什么区别,最终都是所有参数全部传递。
    三、对于可变参数,比如printf,会在第一个参数格式字符串中,指明后续有几个参数,各自是什么类型的。于是在函数中,参数格式字符串必须第一个弹栈,否则无法获取参数类型,也就无法获知后续参数占几个字节,导致无法正确获知参数。
    四、理论上来说,如果从左向右压栈,可变参数标记格式字符串的参数放在最后,那么也是可以的。 不过最早设计C语言的人采用了这种方式,后续也就延续下来了。

     

    源链接:https://zhidao.baidu.com/question/628286190320666284.html

    展开全文
  • C语言函数参数与指针

    2021-02-03 08:57:54
    1 C语言函数返回指针方法 2 C语言函数参数为指针时,注意指针不能指向 NULL; 参考: C语言指针初始化与NULL时作为实参传入函数中出现的问题 3 c语言:如何编写函数,改变传入的指针参数的值 ...

    1 C语言函数返回指针方法
    2 C语言函数的参数为指针时,注意指针不能指向 NULL;
    参考:
    C语言指针初始化与NULL时作为实参传入函数中出现的问题
    3 c语言:如何编写函数,改变传入的指针参数的值
    4 c语言 指针 或 引用的方法可以改变变量的值
    参考:
    C语言函数 传参以及指针与引用小结

    展开全文
  • C语言函数参数传递的时候也会有类似的情形。但这个和struct内存对齐(https://stackoverflow.com/questions/4306186/structure-padding-and-packing)不一样,它不是插入同类型的数据而是忽略比较小的参数,然后...

    我们都知道C语言中,struct会做内存对齐,实际分配的内存出现比看上去的多。

    C语言函数参数传递的时候也会有类似的情形。但这个和struct内存对齐(https://stackoverflow.com/questions/4306186/structure-padding-and-packing)不一样,它不是插入同类型的数据而是忽略比较小的参数指定,然后widen这个参数。

    具体扩展到多大,不同的系统会有不同的大小。对于Linux IA32 是32bits,Linux x86_64是64bits。

    参考:https://stackoverflow.com/questions/30363661/c-function-argument-memory-alignment-considerations

     

    展开全文
  • C语言 函数参数和调用函数

    千次阅读 2019-04-14 08:39:07
    如果函数要使用参数,则必须声明接受参数值的变量。这些变量称为函数的形式参数。 形式参数在进入函数时被创建,退出函数时被销毁。 当调用函数时,有两种向函数传递参数的方式: 传值调用 默认情况下,C 语言使用...

    如果函数要使用参数,则必须声明接受参数值的变量。这些变量称为函数的形式参数
    形式参数在进入函数时被创建,退出函数时被销毁。
    当调用函数时,有两种向函数传递参数的方式:
    在这里插入图片描述

    传值方式调用函数

    默认情况下,C 语言使用传值调用方法来传递参数。一般来说,这意味着函数内的代码不会改变用于调用函数的实际参数。函数 swap() 定义如下:

    /* 函数定义 */
    void swap(int x, int y)
    {
       int temp;
    
       temp = x; /* 保存 x 的值 */
       x = y;    /* 把 y 赋值给 x */
       y = temp; /* 把 temp 赋值给 y */
      
       return;
    }
    

    现在,让我们通过传递实际参数来调用函数 swap():

    #include <stdio.h>
     
    /* 函数声明 */
    void swap(int x, int y);
     
    int main ()
    {
       /* 局部变量定义 */
       int a = 100;
       int b = 200;
     
       printf("交换前,a 的值: %d\n", a );
       printf("交换前,b 的值: %d\n", b );
     
       /* 调用函数来交换值 */
       swap(a, b);
     
       printf("交换后,a 的值: %d\n", a );
       printf("交换后,b 的值: %d\n", b );
     
       return 0;
    }
    

    交换前,a 的值: 100
    交换前,b 的值: 200
    交换后,a 的值: 100
    交换后,b 的值: 200

    上面的实例表明了,虽然在函数内改变了 a 和 b 的值,但是实际上 a 和 b 的值没有发生变化。

    引用方式调用函数

    通过引用传递方式,形参为指向实参地址的指针,当对形参的指向操作时,就相当于对实参本身进行的操作。

    传递指针可以让多个函数访问指针所引用的对象,而不用把对象声明为全局可访问。

    /* 函数定义 */
    void swap(int *x, int *y)
    {
       int temp;
       temp = *x;    /* 保存地址 x 的值 */
       *x = *y;      /* 把 y 赋值给 x */
       *y = temp;    /* 把 temp 赋值给 y */
      
       return;
    }
    

    现在,让我们通过引用传值来调用函数 swap()

    #include <stdio.h>
     
    /* 函数声明 */
    void swap(int *x, int *y);
     
    int main ()
    {
       /* 局部变量定义 */
       int a = 100;
       int b = 200;
     
       printf("交换前,a 的值: %d\n", a );
       printf("交换前,b 的值: %d\n", b );
     
       /* 调用函数来交换值
        * &a 表示指向 a 的指针,即变量 a 的地址 
        * &b 表示指向 b 的指针,即变量 b 的地址 
       */
       swap(&a, &b);
     
       printf("交换后,a 的值: %d\n", a );
       printf("交换后,b 的值: %d\n", b );
     
       return 0;
    }
    

    交换前,a 的值: 100
    交换前,b 的值: 200
    交换后,a 的值: 200
    交换后,b 的值: 100

    上面的实例表明了,与传值调用不同,引用调用在函数内改变了 a 和 b 的值,实际上也改变了函数外 a 和 b 的值。

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

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

    千次阅读 2019-07-26 17:12:21
    涉及:数组参数、指针参数... *函数参数是指针和指针引用的区别在于: 参数是指针:参数可以看作传的是地址,不能改变实参所指向的地址。 参数是指针引用:参数可以看作是实参指针本身,可以改变内部所指向的地址...
  • C语言函数参数为空和void

    千次阅读 2016-03-03 10:04:38
    C语言中函数声明对函数的检测最主要的标准是函数名,C语言函数参数列表中的参数名可以缺省   C语言当中参数列表中的数据类型也可以缺省,默认是int。   add()并不等价于add(void); add(void)明确...
  • c语言函数参数自增自减情况分析(一) 上代码: void hahaha( int i, int * k) { printf(&quot;%d\n&quot;, i); printf(&quot;%d\n&quot;, i); printf(&quot;%d\n&quot;, *k); } ...
  • c语言 声明函数时可省略形参名,编译器只检查参数类型和个数; 行参的作用是占位符,编译器会忽略; C编译器在编译时忽略参数名,只检查函数参数的类型和顺序是否与调用的函数匹配; 函数参数入栈顺序 一般是...
  • 对技术执着的人,比如说我,往往对一些问题,不仅想做到“知其然”,还想做到“知其所以然”。...某天某地某人问我,C语言函数参数的入栈顺序如何?从右至左,我随口回答。为什么是从右至左呢?我终究没有给
  • C语言函数参数的传递详解

    千次阅读 多人点赞 2019-03-31 15:04:54
    我们都知道:C语言函数参数的传递有:值传递、地址传递、引用传递这三种形式。题一为值传递,题二为地址传递,题三为引用传递。不过,正是这几种参数传递的形式,曾把我给搞得晕头转向。我相信也有很多人与我有...
  • C语言函数参数列表里的“...”

    千次阅读 2019-05-08 11:46:34
    以Linux “man 手册”里的printf函数声明为例,谈谈我对C语言函数的可变参数的一点理解。 printf的函数声明如下:int printf(const char *format, …); 通常情况下,以这种形式声明的函数参数列表至少需要一个普通的...
  • 这种格式是OK的,因为无论调用函数的程序传递给它的数组参数的长度是多少,这个函数都将照收不误。 这是一个伟大的特性,它允许单个函数操纵任意长度的一维数组。 这个特性不利的一面是函数没法知道该数组的长度。...
  • C语言函数参数传递原理

    千次阅读 2014-07-29 10:34:19
    C语言参数的传递方式一般存在两种方式:一种是通过栈的形式传递,另一种是通过寄存器的方式传递的。这次,我们只是详细描述一下第一种参数传递方式,另外一种方式在这里不做详细介绍。 首先,我们看一下,下面一个...
  • 1.数组名可以作为函数实参和形参,传递的数组首元素的地址。这样两个数组就共占同一内存,形参数组中各元素值的改变必将引起实参的改变。 ...2.多维数组名做函数参数时,形参的定义: eg.int arr
  • C语言的基本单位是“函数”。每个函数都有参数(空参数也是参数),参数的传递规则是值传递,也就是先计算实参表达式的值,然后将其复制到形参变量的内存空间。我们是否思考过这个问题:如果函数传递多个参数,那么...
  • C语言函数参数是如何传递的?

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

    万次阅读 2013-12-29 20:16:31
    值传递,即按值传递参数,按值传递参数时,是将实参变量的值复制一个到临时存储单元中,如果在调用过程中改变了形参的值,不会影响实参变量本身,即实参变量保持调用前的值不变。 1、形参只能是变量,实参可以是常量...
  • 大家都知道,c语言一般的参数都是传值调用的,但有时候也有例外,下面就分析一下什么时候传值调用,什么时候传址调用。 传值调用 标量参数都是传值调用,不会对标量产生任何影响 #include void add_one(int value)...
  • 来源:公众号【编程珠玑】作者:守望先生前言函数传参有三种传参方式:传值、传址、传引用。我们可能听过C语言中的传值和传指针,在其他语言中,也有传引用一说,那么他们到底有什么...
  • 函数参数入栈顺序的确是从右至左的。可到底为什么呢?查了一直些文献得知,参数入栈顺序是和具体编译器实现相关的。比如,Pascal语言中参数就是从左到右入栈的,有些语言中还可以通过修饰符进行指定,如Visual C++....
  • C语言函数参数调用顺序

    千次阅读 2011-10-26 21:48:12
    浩然君前几天发过一个小文件:关于函数参数的调用顺序的 int arr[] = {6,7,8,9,10}; int *ptr = arr; *(ptr++) += 123; printf(“ %d %d ”, *ptr, *(++ptr));   输出:8 8 函数参数入栈的顺序,...
  • ``` #include #include #include ...初步探明:0x00000014为simple_va_fun的第一个参数20,但是不知道为什么返回地址返回到了第一个参数的值所示的地址处,求大神解答如何解决??万分感谢!!!!!

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 21,733
精华内容 8,693
关键字:

c语言函数参数

c语言 订阅