首页
学习
活动
专区
圈层
工具
发布

C语言 | 函数调用

C语言函数调用的形式 一般形式 函数名(实参表列) 函数调用语句 把函数调用单独作为一个语句。 函数参数 函数调用作为另一个函数调用时的实参。 调用函数并不一定要求包括分号。...只有作为函数调用语句才需要有分号。如果作为函数表达式或函数参数,函数调用本身是不必有分号的。 C语言函数调用时的数据传递 在调用有参函数时,主调函数和被调函数之间有数据传递关系。...C语言函数调用的过程 在定义函数中指定的形参,在未出现函数调用时,它们并不是占内存中的存储单元。 将实参对应的值传递给形参。 通过return语句将函数值带回到主调函数。 调用结束,形参单元被释放。...实参向形参的数据传递是“值传递”,单向传递,只能由实参传给形参,而不能由形参传给实参。 C语言函数的返回值 函数的返回值是通过函数中的return语句获得的。...100道C语言源码案例请去公众号:C语言入门到精通

4.6K10

函数递归和简单的例子(c语言)

什么是递归 递归是学习C语⾔函数绕不开的⼀个话题,那什么是递归呢? 递归其实是⼀种解决问题的⽅法,在C语⾔中,递归就是函数⾃⼰调⽤⾃⼰。...我们写一个简单的递归 #include int main() { printf("hehe\n"); main();//main函数中⼜调⽤了main函数 return 0...; } 我们看到这个递归是每次都调用自己的main()函数没有限制条件所以一直打印hehe....三例子:用递归求阶乘 int fun(int n) { if (n == 0) { return 1; } else { return fun(n - 1) * n; } } int...四 递归的特点 运用少量的代码来运算 思路清晰,化大为小 要有限制条件,每一次递归会逼近停止条件,要不会死循环 总结 其实递归程序会不断的展开,在展开的过程中,我们很容易就能发现,在递归的过程中会有重复计算

66210
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    7.2 C语言调用函数

    01函数调用的形式 1、一般形式 函数名(实参表列) 2、函数调用语句 把函数调用单独作为一个语句,如c=max(a,b),max(a,b)是一次函数调用,它是赋值表达式中的一部分。...3、函数参数 函数调用作为另一个函数调用时的实参。 4、调用函数并不一定要求包括分号,只有作为函数调用语句才需要有分号。如果作为函数表达式或函数参数,函数调用本身是不必有分号的。...02 函数调用时的数据传递 1、在调用有参函数时,主调函数和被调函数之间有数据传递关系。...03 函数调用的过程 1、在定义函数中指定的形参,在未出现函数调用时,它们并不是占内存中的存储单元。 2、将实参对应的值传递给形参。 3、通过return语句将函数值带回到主调函数。...3、在定义函数时指定的函数类型一般应该和return语句中的表达式类型一致。 4、函数类型决定返回值类型。 C语言 | 求1+2+...100的和 更多案例可以go公众号:C语言入门到精通

    3.3K3027

    C语言函数调用约定

    ,C语言默认调用约定,参数通过从右向左的顺序压栈,调用者函数恢复堆栈 1265: ff 75 fc push DWORD PTR [ebp-0x4...,程序的执行实际上就是函数之间的相互调用。...这个弹出的工作可以由调用方来完成,也可以由被调用方来完成。 [函数名修饰方式]:函数名在编译时会被修改,调用惯例可以决定如何修改函数名。...函数调用惯例在函数声明和函数定义时都可以指定,语法格式为: ‌返回值类型 调用惯例 函数名(函数参数) int __cdecl max(int m, int n); // __cdecl是C语言默认的调用约定...函数的第一个和第二个DWORD参数通过ecx和edx传递,剩下的参数按照从右到左的顺序入栈 cdecl: C语言默认,变参函数 由于每次函数调用都要由编译器产生还原栈的代码,所以使用 __cdecl

    1.4K10

    C语言函数的调用-学习十七

    如: printf_star(); 这时不要求函数带回值,只要求函数完成一定的操作。 2.函数表达式 函数调用出现在另一个表达式中。如:c=max(a,b); 这时要求函数带回一个确定的值。...3.函数参数 函数调用作为另一函数调用时的实参。如:m=max(a,max(b,c)); 其中 max(b,c) 是一次函数调用,它的值作为max另一次调用的实参。...C语言规定,实参变量对形参变量的数据传递是“值传递”,即单向传递,只由实参传给形参,而不能由形参传回来给实参。 在内存中,实参单元与形参单元是不同的单元。...add(a, b); printf("结果:%f\n", c); } 如果已经在文件的开头( 所有函数之前),对本文中所调用的函数进行了声明,则在各函数中不必对其所调 用的函数再作声明。...add(float x, float y) { float z; z = x + y; return z; } 例子 将在max函数中定义的变量 z 改为float型。

    3.2K30

    函数调用堆栈图-c语言

    我们就使用一个简单的c语言程序来对描述一下在函数调用的时候都发生了什么。 ?...中间的一小段没有意义的汇编语言是为了方便设置断点,为后面的调试做好铺垫,因为有时会碰到找不到断点位置的情况,使用这个方法,可以在找不到断点的时候向后执行一次,而不破坏我们想调试的程序当前的堆栈状态,这里对...此时的堆栈是没有发生变化的,现在开始到了函数调用的关键阶段了。...然后让esp减去了0c0h位,开始提升堆栈了,为程序的运行开辟一个存储空间,这个区域也就是平时所说的缓冲区,因为一个单元是四个字节,c0也就是往上提了48个格,由于位置有限中间依旧省略,此时堆栈就变成了如下的样子...还有另一种方式是使用内平栈的方式,即在函数内部就将堆栈恢复平衡,使用ret 8的方式。 再往后面的操作就是main函数的堆栈平衡的处理了,与上面的函数调用类似,就不提了。

    3.7K10

    【C语言函数调用详解】——传值调用&传址调用

    来举个例子: 我们来写一个函数交换两个变量的内容: #include //实现成函数,但是不能完成任务 void Swap1(int x, int y) { int tmp =...,传值调用好像不能达到交换num1,num2的目的,我们看看结果是什么样的: 因此,传值调用,要想在函数内部交换两个变量的值,是不可行的。...这里就需要传址调用。 二.传址调用 那什么是传址调用呢?这里的“址”指的是地址。 传址调用是把函数外部创建变量的内存地址传递给函数参数的一种调用函数的方式。...这种传参方式可以让函数和函数外边的变量建立起真正的联系,也就是函数内部可以直接操作函数外部的变量。...以上就是对函数调用的两种方式,传值调用和传址调用的介绍,欢迎大家指正,我们一起进步!!!

    2.7K10

    C语言函数的定义与调用-学习十六

    3.C程序的执行是从main函数开始的,如果在main函数中调用其他函数,在调用后流程返回到main函数,在main函数中结束整个程序的运行。...4.所有函数都是平行的,即在定义函数时是分别进行的,是互相独立的。 一个函数并不从属于另一个函数,即函数不能嵌套定义。 函数间可以互相调用,但不能调用main函数。...main函数是被操作系统调用的 5.从用户使用的角度看,函数有两种。 库函数。它是由系统提供的,用户不必自己定义而直接使用它们。...应该说明,不同的C语言编译系统提供的库函数的数量和功能会有一些不同,当然许多基本的函数是共同的。 用户自己定义的函数。它是用以解决用户专门需要的函数。 6.从函数的形式看,函数分两类。 无参函数。...例子 编写一个求阶乘的函数,求5! +6! +7!

    1.7K20

    【C语言】函数递归例子1汉诺塔问题

    昨天我总结函数递归说到了两个例子,今天我们就来看一下其中之一汉诺塔 1.汉诺塔是什么? 汉诺塔(Tower of Hanoi),又称河内塔,是一个源于印度古老传说的益智玩具。...我之前总结道函数递归思想是把大规模事化小规模事的过程,并且都含有一个相同规律点从而不断化小下去,所以我们先假设n为一个数。...5.运用代码实现汉诺塔 创建Hanoi函数 首先在main函数里规定一个Hanoi函数,这个函数用来表示汉诺塔整个过程,根据汉诺塔的玩法其实整个过程就是将初始A上的盘子通过B移动到C上 所以需要调用的实参就是三个柱子...柱移动到C柱上 Hanoi('A', 'B', 'C', n); return 0; } Hanoi函数递归 在Hanoi函数内部,我们首先要分情况讨论,如果n=1时,我们是不是只需要将A--->...C(A移动到C)移动需要创建一个move函数,只有n>1时才符合我们得出的结论,然后再按照结论得出的三步骤,根据我们得到的结论我们是不是可以发现我们的结论符合Hanoi函数递归的条件从而不断重复这三个步骤

    74010

    C语言函数调用和数组错误总结

    这部分是函数调用错误和数组错误总结 当时写的二分法查数组位置,用函数调用二分法,给大家看一下我的错误调用方式,我直接把定义的函数名整体粘贴复制用,后来改了也是带着int 哈哈. ...//left 数组的左下标 //right 数组的右下标 //key 要查找的数字 int main() { int arr[9] = { 1, 3, 5, 7, 9, 54, 23, 87, 12...key) { right = arr[mid - 1]; } else if (arr[mid] < key) { left = arr[mid + 1]; } 重复踩坑的就是数组的函数调用..., (错误示范) 我这里想实现一个调用函数使定义的数组初始化为0, 一心想着像定义一样初始化数组就不停尝试下面这样初始化,   (错误示范) int arr[8] = {0}; 但正确的方式下面是用赋值方式将所有元素赋值为...,而且满足函数的 高内聚 ,低耦合 ,用int sz来求数组长,再去传数值, 应用函数再调用. int main() { int arr[] = { 1,2,3,4,5,6,7,8 }; int sz

    1.1K10

    C语言函数调用及栈帧结构

    函数返回地址:保存当前函数调用前的“断点”信息,也就是函数调用前的指令位置,以便在函数返回时能够恢复到函数被调用前的代码区中继续执行指令。...然后继续执行下一条语句:mov ebp,esp即把esp的值赋给ebp,这样,ebp也就指向了现在esp的位置 然后sub esp 0C0h 这样就为main函数开辟了一段空间然后将ebx、esi、edi...如此一来,几乎所有的c函数都由如下两个指令开 始: push ebp mov ebp, esp 下一步,fun必须为它的局部变量分配空间,同时,也必须为它可能用到的一些临时变量分配 空间。...比如,foo中的一些C语句可能包括复杂的表达式,其子表达式的中间值就必须得有地方存放。...如果在函数调用前,EAX,ECX和EDX寄存器的值被保存在栈中,调用者main函数现在可以把它们弹出。这个动作之后,栈顶就回到了我们开始整个函数调用过程前的位置。这样整个函数的调用就结束了

    2.6K30

    【C 语言】C 语言 函数 详解 ( 函数本质 | 顺序点 | 可变参数 | 函数调用 | 函数活动记录 | 函数设计 )

    C 语言 函数 的 缺省认定 (n) 标题3 4.可变参数 的 定义 和 使用 (1) 简介 (2) 代码示例 ( 定义 使用 可变参数 ) 三. 函数 与 宏 1...., 这些简单问题就可以作为一个个的函数来编写; 2.C语言程序 : 将一个复杂的程序拆解成一个个模块 和 库函数; 一个复杂的 C 语言程序有几十上百万行代码, 这些代码可以分解成若干模块来实现, 即分解成一个个的函数来实现...的思想在 C 语言 中的核心就是 函数; 4.分解函数 : 复杂问题 分解后的过程可以分为一个个函数一步步实现; ---- 3....语言规范中没有规定函数参数必须从左到右进行计算赋值; 3.运算符编程注意点 : C语言中大多数的运算符的操作数求值顺序也是不固定的, 依赖于编译器的实现; 4.示例 : 如 int ret = fun1...C 语言 函数 的 缺省认定 (n) 标题3 ---- 函数缺省认定简介 : 1.描述 : C 语言中 默认 没有类型的 参数 和 返回值 为 int 类型; 2.举例 : fun(i) {

    2.1K30

    C语言竟可以调用Go语言函数,这是如何实现的?

    今天和大家聊一个问题,一门语言是否可以在同一个进程内调用另外一门语言实现的函数?例如 C 语言是否可以调用 Golang 实现的函数?...一、C 调用 Go 函数的例子 一个 C 调用 Go 的程序实现大致可以分为下面三个步骤: 第一步:使用 Golang 定义和实现一个函数 第二步:将 Golang 代码编译成一个静态/动态链接库 第三步...:在 C 语言中调用该静态/动态链接库 我们先来看一个最简单的例子,看看 C 语言调用 Go 函数该如何使用的。...1.3 C 语言调用库中函数 接着我们再写一小段简单的 C 语言代码,来调用动态库中的 add 函数。...函数调用入口 _cgo_export.c 在 C 语言代码中调用 add 函数时,最先进入的是位于 _cgo_export.c 中的调用入口。

    1.5K00

    你真的知道C语言函数调用的内幕吗?

    1 C语言使用函数调用,我们再熟悉不过了,但是函数调用在内存中究竟发生了什么真的清楚吗?只有搞清楚内存里的内幕,才算完全搞懂函数的调用。 这里涉及一个知识点:栈。...栈内存的大小由函数定义的局部变量的具体情况而定,另外,一个程序里的所有函数的栈内存在逻辑上是连在一起的,比如a函数分配了一段栈内存,此时a函数又调用了b函数,那么b函数的栈内存会接着在a函数栈内存之后去分配...总结几点比较重要的: 一、栈在函数调用中起着非常重要的作用: 向被调用函数传递参数,参数从右往左依次push到栈中; 保存函数的非静态局部变量; 返回函数的返回值 保存上下文的环境,保留之前的数据,比如...注意,执行fun1函数的时候,main函数并没有退出,它的栈帧也没有消失,fun1函数的栈帧是堆叠在main函数的栈帧下面的,如果fun1函数还调用了其它函数,那么栈内存就继续向下增长。...三、栈内存它是临时性的,相应函数的退出(比如fun1函数执行完return返回c 之后),栈帧就会被释放,也就是这块栈空间被释放(系统回收),然后随着逐个函数的退出,栈空间也逐个从下往上退出。

    1K10

    【C语言】汇编角度剖析函数调用的整个过程

    提示:本文意在使用汇编的语言给大家介绍函数调用中栈区上的过程变化,加深我们对于代码底层的理解,由于不同的编译器使用下,可能造成一些差异,但这并不影响我们对于知识原理的掌握,所以本文不必过多纠结细节处的变化...invoke_main() { return main(__argc, __argv, _get_initial_narrow_environment()); } 2.下面的代码分别是C语言代码和汇编语言代码...我们会在调用函数前进行函数参数的内容,进行一个压栈操作,当进入到被调用函数内部的时候,我们会通过指针的偏移量找到函数参数,并对其进行操作。...我们会通过汇编语言中的call指令,先将其下一条指令的IP压栈到我们的栈帧空间当中,并且指向call指令,会进入到被调用函数的汇编代码当中,进行被调用函数的汇编指令 并且我们函数调用结束后,通过ret指令能够回到上一层函数中...call指令的下一条指令,因为我们的栈帧空间当中已经压栈了call指令的下一条指令的IP 6.函数调用结束后是怎么返回的 我们是通过eax寄存器将我们被调用函数中的返回值,存储起来,等回到上一层函数后,

    2.8K11

    C语言函数的调用——比较两个数的大小

    目录 一、先写好框架 二、然后定义我们需要的变量 三、这里就要写函数的部分 四、函数部分写完了,但是还一个地方,要值得注意  一、常规方法比较大小 二、指针操作比较大小 今天我们要写的是用调用函数的方法来...%d",&i,&j); 三、这里就要写函数的部分 //这里的max是我们定义的函数名字,这个函数定义为int型表示我们最终要返回一个整形的数字 //括号里的两个表示形参,即我们要把我们在主函数中输入的两个数字放进去...,然后再执行函数里面的语句 int max(int i, int j) { if(i>j)//很明显的比大小了 return i; else return j; } 四、函数部分写完了,...但是还一个地方,要值得注意         当我们写了函数之后,要在主函数之前声明一遍, 这里就是告诉程序,我在下面的主函数中要用到我定义的这个函数   声明如下 一、常规方法比较大小 #include...%d%d",&i,&j); printf("%d\n",max(i,j));//声明完成之后,在这里调用我们写的函数,并且把我们输入的两个参数放进函数中 } int max(int i, int j

    4.2K20

    易语言调用C++ DLL回调函数

    易语言适合用于数据展示,数据的获取还是VC来的快、方便哈。 因此我一般使用VC编写DLL,使用易语言编写界面,同一个程序,DLL和EXE通讯最方便的就是使用接口回调了。 废话少说,进入主题。 1....VC编写DLL 为了DLL能够调用EXE中的函数,我们先声明回调函数原型: // 回调函数原型 // 接口调用方式:WINAPI // 接口参数:int iData // 返回值:无 typedef VOID...(WINAPI *PFN_CALLBACK)(int iData); 声明好了回调函数原型,我们需要知道EXE中函数的地址,因此需要在DLL中提供个接口给EXE调用,让EXE把函数地址传给DLL: /.../ 用来保存EXE中的函数地址 PFN_CALLBACK g_pfnUser = NULL; // 给EXE调用的接口,让EXE把自身的某个子程序地址传给DLL BOOL WINAPI SetCallback...EXE函数的接口: // 调用EXE回调函数 VOID WINAPI StartCallback(VOID) { if (g_pfnUser !

    1.2K10

    C语言函数嵌套与递归调用-学习十八

    函数的嵌套调用 C语言的函数定义是互相平行、独立的即函数不能嵌套定义,但可以嵌套调用函数。 即调用一个函数的过程中,又可以调用另一个函数。 image.png 上图表示了两层嵌套的情形。...其执行过程是: 1.执行 main函数 中调用 a函数 的语句时,即转去执行a函数; 2.在 a函数 中调用 b函数 时,又转去执行 b函数; 3.在 b函数 执行完毕返回 a函数 的断点继续执行; 4...例如: 输入4个整数,找出其中最大的数。用函数的嵌套调用来处理。...a : b); } image.png 函数的递归调用 在调用一个函数的过程中又出现直接或间接地调用该函数本身,称为函数的递归调用。...有一个和尚想把这64 个盘从座A搬到座C,但一次只能搬一个盘,搬动的盘只允许放在其他两个座上,且大盘不能压在小盘上,移动过程可以使用B座。编写函数输出移动盘子的步骤。

    2.4K31
    领券