-
2019-06-10 08:33:06
c语言 函数调用中实际参数为赋值表达式情况
例
#include<stdio.h>
void zm_f(int);int main(void)
{
int a;
a=2;
printf(“a=%d\n”,a);
zm_f(++a==3?8:1);/或者是将++a与其他值比较/
printf(“now a=%d\n”,a);
return 0;
}
void zm_f(int n)
{
int a;
for(a=0;a<n;a++)
printf("%c",‘f’);
printf("\n");
}
输出为
从结果可以知道,在调用zm_f()函数的时候,要先对赋给zm_f()的实际参数即表达式求值,而求值的时候变量a的值刷新了,其值增加了,然后将求得到值再赋给形式参数。注意,求值过程中a的值刷新了。更多相关内容 -
C语言函数 -C语言函数调用和参数传递
2021-05-20 08:45:54C语言函数调用函数的调用指的就是函数的使用方法。在程序中使用已经定义的函数,可以使用函数调用表达式,其一般格式如下:函数名(实参1, 实参2, …) //实参对应于函数定义时的形参声明程序执行时,函数调用表达式将...C语言函数被定义以后可以被多次调用,调用的时候可以向它传递参数。
C语言函数调用
函数的调用指的就是函数的使用方法。
在程序中使用已经定义的函数,可以使用函数调用表达式,其一般格式如下:
函数名(实参1, 实参2, …) //实参对应于函数定义时的形参声明
程序执行时,函数调用表达式将会被函数返回值所代替(见图 1)。函数的返回值一般由 return 语句指定。
图 1:函数调用时参数的传递(值传递)和值的返回
程序运行中进行函数调用后,程序的流程会转到被调用的函数处,同时传递过来的实参的值被赋值给函数对应的形参(形参初始化),接着执行函数体语句,在遇到 return 语句,或者执行到函数体最后的大括号时,程序流程就会从该函数跳转到原来调用函数的位置(见图 2)。
图 2:调用函数时程序的执行流程
代码清单 1:使用函数求两个整数中较大的值
#include
#include
/*---自定义函数Max2:返回较大值---*/
int Max2 (int a, int b)
{
if(a>b)
return a;
else
return b;
}
/*---主函数---*/
int main( )
{
int n1,n2;
puts("请输入两个整数。\n");
printf("整数1:"); scanf("%d",&n1);
printf("整数2:"); scanf("%d",&n2);
printf("较大的值是%d \n",Max2(n1,n2)); //调用Max2函数
system("pause");
return 0;
}
运行结果为:
请输入两个整数。
整数1:66
整数2:47
较大的值是66
知识点总结
函数调用的形式是在函数名后面加上小括号“()”。
函数调用时,小括号“()”中的参数称为“实参”。
函数调用的形式可称为“函数的调用表达式”。
函数调用表达式的值就是函数的返回值。
函数调用时参数的传递:值传递
上面的代码清单 1 中,main( ) 函数通过 Max2(n1,n2) 调用自定义函数 Max2 时,实参变量 n1 的值被赋值给 Max2 的形参变量 a,实参变量 n2 的值被赋值给 Max2 的形参变量 b,此时,a 是 n1 的副本,两者具有相同的值,b 是 n2 的副本,两者具有相同的值。像这样通过值来进行参数传递的机制称为值传递。
由于函数间参数的传递是通过值传递进行的,所以,函数调用表达式中的实参可以是另一个有返回值的函数调用表达式(见图 3)。
图 3:将函数的返回值作为参数传递给函数
知识点总结
函数间参数的传递是通过值的传递进行的。
函数调用时实参的值会被赋给形参。
形参所指的变量是对应的实参所指的变量的副本,它们具有相同的值。
3. 函数调用时数组的传递
自定义函数中,如果形参接收的是一个数组,则定义函数时要在形参声明中加上[ ]。而在函数调用表达式中的实参则直接使用数组名即可(见图 4)。
指向数组的形参声明格式如下:
类型名 形参名[ ] //形参名与指向的原数组名不同
//类型名与数组的数据类型相同
图 4:函数调用中数组和变量值的传递
代码清单 2:使用函数(数组的传递)计算数学成绩和英语成绩的最高分
#include
#include
#define NUMBER 5
/*--自定义函数:返回拥有n个元素的数组v中的最大值--*/
int Max_of(int v[],int n)
{
int i,max=0;
for(i=0;i
if(v[i]>max) max=v[i];
return max;
}
/*---主函数---*/
int main()
{
system("color 70");
int i,eng[NUMBER],math[NUMBER],max_e,max_m;
printf("请输入%d名学生的成绩。\n",NUMBER);
for(i=0;i
printf("[%d]英语:",i+1); scanf("%d",&eng[i]);
printf(" 数学:"); scanf("%d",&math[i]);
}
max_e=Max_of(eng,NUMBER); //调用Max_of函数
max_m=Max_of(math,NUMBER); //调用Max_of函数
printf("英语最高分=%d\n",max_e);
printf("数学最高分=%d\n",max_m);
system("pause");
return 0;
}
运行结果为:
请输入5名学生的成绩。
[1]英语:89
数学:78
[2]英语:77
数学:88
[3]英语:79
数学:83
[4]英语:71
数学:87
[5]英语:70
数学:96
英语最高分=89
数学最高分=96
图 5 展示了函数调用中数组的传递和变量值传递的区别。
图 5:函数调用中数组的传递和变量值传递的区别
知识点总结
函数内接收数组的形参所指的数组就是原数组本身,只是数组名改变为形参的参数名而已(有别于一般变量参数值的传递)。
在函数内对形参数组的修改实际上就是对实参数组(原数组)的修改。
在函数内改变形参变量的值不会影响实参变量。
-
关于C语言函数调用汇编时参数大于4个的时候该如何传参-附件资源
2021-03-05 15:23:49关于C语言函数调用汇编时参数大于4个的时候该如何传参-附件资源 -
C语言函数调用参数压栈的相关问题
2020-07-29 15:14:33本文主要为大家详细讲解一下C语言函数调用参数压栈的相关问题。 -
c语言函数中调用的参数太多
2021-07-29 13:24:23 -
C语言中函数声明与调用问题
2020-12-31 01:31:07假如函数在调用它之前定义... 您可能感兴趣的文章:深入理解C++中public、protected及private用法C/C++函数调用的几种方式总结浅析C语言中堆和栈的区别关于C语言中参数的传值问题浅谈C语言函数调用参数压栈的相关问题 -
c语言函数调用及应用举例
2019-04-20 16:27:29一般来说,执行源程序就是执行主函数main,其他函数只能被主函数所调用,而其他函数之间也可以相互调用。 1.标准库函数: 分为:I/O函数,字符串,字符处理函数,数学函数,接口函数,时间转换和操作函数,动态...一,函数的定义
一般来说,执行源程序就是执行主函数main,其他函数只能被主函数所调用,而其他函数之间也可以相互调用。
1.标准库函数:
分为:I/O函数,字符串,字符处理函数,数学函数,接口函数,时间转换和操作函数,动态地址分配函数,目录函数,过程控制函数,字符屏幕和图形功能函数。
这些库函数在不同的头文件中声明。比如:
math.h头文件中有:sin(x),cos(x),exp(x)(求e^x),fabs(x)(求x的绝对值)等库函数。
stdio.h头文件中有:scanf(),printf(),gets(),puts(),getchar(),putchar()等库函数。
string.h头文件中有:strcmp(),strcpy(),strcat(),strlen等库函数。
2.函数的定义:
(1)定义无参函数:
类型名 函数名()
{
函数体
}
or
类型名 函数名(void)
{
函数体
}
(2)定义有参函数
类型名 函数名(形式参数表列)
{
函数体
}
(3)定义空函数
类型名 函数名()
{ }
二,函数的调用
1.函数调用时的参数传递
函数间通过参数来传递数据,即通过主调函数中的实际参数(实参)向被调用函数中的形式参数(形参)进行传递。
实参向形参传递数据的方式:实参将值单向传递给形参,形参的变化不影响实参值。
for example:
#include<stdio.h> #include<stdlib.h> int main() { int a, b; void swap(int a, int b); //函数声明 scanf("%d%d", &a, &b); //键盘输入 swap(a, b); //函数调用 printf("最终的a,b值:\n a=%d b=%d\n", a, b); system("pause"); return 0; } void swap(int a, int b) { int t; if (a < b) { t = a; a = b; b = t; //a中放大值,b中放小值 } printf("自定义函数的a,b值:\n a=%d b=%d\n", a, b); }
运行结果为:
分析:形参交换了数据,而实参保持原数据不变。这是单向的值传递,所以形参的值改变后而实参的值没有改变。
- 形参在函数中是变量名,在函数调用时,形参被临时分配相应的内存,调用结束后,形参单元被释放,而实参单元保留并维持原值。
- 实参是表达式,负责向对应的形参标识的内存单元传递数据,实参向形参的数据传递是“值传递”。
- 实参与形参必须个数相同
- 对应的形参和实参的类型必须一致
2.函数的返回值
(1)函数的返回值通过函数中的return语句获得。如果需要从调用函数带回一个函数值(供主函数使用),被调函数中需包含return语句。
for example:
int max(int x,int y) { return(x>y?x:y); }
(2)在定义函数时要指定函数值的类型
int max(float x,float y) //函数值为整型 char letter(char c1,char c2) //函数值为字符型 double max(int x,int y) //函数值为双精度型
(3)函数类型决定返回值的类型。
3.函数的嵌套
定义函数时不能定义另一个函数,但是可以进行嵌套调用函数。
for example:
*用函数嵌套找出4个数中的最大值。
#include<stdio.h> #include<stdlib.h> int max2(int a, int b) //找出a和b中的最大值 { if (a >= b) { return a; // a作为返回值 } return b; // b作为返回值 } int max4(int a, int b, int c, int d) //定义找4个数最大值的函数 { int m; //存最大值 m = max2(a, b); //调用max2函数,将a,b中大的值放在m中 m = max2(m, c); //调用max2函数,将a,b,c中大的值放在m中 m = max2(m, d); //调用max2函数,将a,b,c,d中大的值放在m中 return m; //返回到主函数 } int main() { int a, b, c, d; int max; printf("请输入四个数:\n"); scanf("%d%d%d%d", &a, &b, &c, &d); max = max4(a, b, c, d); //调用max4函数 printf("最大数位:%d\n", max); system("pause"); return 0; }
三,函数的递归
1.递归概念:
函数的递归调用是指:一个函数在他的函数体内直接或间接地调用它自身。分为:直接递归(函数直接调用自身)和间接递归(函数通过其他函数调用自身)。可分为“回溯”和“递推”两个阶段。
2.递归函数的一般形式:
反值类型 递归函数名(参数说明表)
{
if(递归终止条件)
返回值=递归终止值;
else
返回值=递归调用(...)的表达式;
return 返回值;
}
3.递归函数举例:
*用递归求n的阶乘。
#include<stdio.h> #include<stdlib.h> int fac(int n) //定义函数 { int f; if (n < 0) printf("数据错误\n"); else if (n == 0 || n == 1) f = 1; else f = n* fac(n - 1); //n!=n*(n-1) return f; //返回主函数 } int main() { int n, y; printf("请输入n的值\n"); scanf("%d", &n); y = fac(n); //这里n为实参 printf("%d!=%d\n", n, y); system("pause"); return 0; }
汉诺塔问题为经典的递归调用实例。代码如下:
#include<stdio.h> #include<stdlib.h> void move(char x, char y) //输出移盘方案 { printf("%c->%c\n", x, y); } void hanoi(int n, char one, char two, char three) //移盘 { if (n == 1) move(one, three); //如果是1个盘,直接从第一个座移到第3个座上 else { hanoi(n - 1, one, three, two); move(one, three); hanoi(n - 1, two, one, three); } } int main() { int n; printf("输入盘的个数\n"); scanf("%d", &n); printf("移盘的步骤:\n"); hanoi(n, 'A', 'B', 'C'); system("pause"); return 0;
分析:将n个盘子从A座上移到C座上需要三步:
(1)将A上的n-1个盘子借助C座先移到B座上;
(2)把A座上剩下的一个盘子移到C座上;
(3)将n-1个盘从B座上借助于A移到C座上。
-
c语言函数中调用的参数太多_函数的参数太少(C语言错误)
2020-07-08 06:02:34c语言函数中调用的参数太多 很少参数无法使用C语言 (Too few arguments to function in C language) This error occurs when numbers of actual and formal arguments are different in the program. 当程序中实际... -
C语言函数调用堆栈过程
2018-11-01 17:15:27函数调用堆栈过程 调用约定 函数的调用约定很多,常见的包括__stdcall,__cdecl,__fastcall,__thiscall等等。主要的区别在于约束的三个事件,一个是参数传递是从左开始呢还是从右开始,还有就是堆栈清理的清理方是... -
C语言函数调用之可变参数列表
2018-03-16 16:00:33在C语言中,函数调用可以传参,也可以不传参,可以传一个参数,也可以传多个参数。今天我们来聊聊有关C语言中的可变参数列表。 先来看一段代码: #include<stdio.h> #include<stdlib.h&... -
C语言函数调用栈(一)
2018-07-19 22:16:25编译器使用堆栈传递函数参数、保存返回地址、临时保存寄存器原有值(即函数调用的上下文)以备恢复以及存储本地局部变量。 不同处理器和编译器的堆栈布局、函数调用方法都可能不同,但堆栈的基本概念是一... -
C语言函数及其调用
2019-04-19 00:08:23一、C语言函数 1.概念:函数是一组一起执行一个任务的语句,每个c程序都必须有一个main函数,程序员可以把代码划分到不同的函数当中去,在逻辑上,划分通常是根据每个函数执行一个特定的任务来进行的。c标准库提供... -
C语言函数
2021-05-21 05:26:57C语言中的函数在其他编程语言中也称为过程或子程序。要执行任务,我们可以创建函数。一个函数可以被多次调用。 它提供了模块化和代码可重用性。C语言中函数的优点函数有很多优点。它们分别如下 -(1)代码可重用性通过... -
c语言函数调用原理底层分析
2019-03-26 22:51:272函数调用机制 2.1按调用约定传递参数 2.1调用约定 调用方(caller)和被调方(callee)需要约定以下内容: 1传参顺序 2传递参数的媒介(是放栈还是寄存器) 3清理参数的责任归属 4返回值的传递媒介(返回值... -
C语言函数定义和函数调用
2020-04-01 19:05:47最简单的程序有一个主函数 main(),但实用程序往往由多个函数组成,由 主函数调用其他函数,其他函数也可以互相调用。函数是C源程序的基本模块,程序的许多功能是通过对 函数模块的调用来实现的,学会编写和调用函数可以... -
C语言函数调用过程
2018-04-22 18:44:44C语言的函数调用过程 反汇编代码 main()函数的创建 Add()函数的调用过程 main()函数的销毁 C语言的函数调用过程 先上一段代码 #include<stdio.h> int Add(int x, int y) { int z = 0; z = x... -
C语言函数调用时候内存中栈的动态变化详细分析
2019-05-02 00:23:41先了解如下几点知识和过程: ...这些指令代码是存放在内存中进程的代码段,同一个函数内的指令代码是按照地址顺序存储的(编译器决定的)(也就是说只要指令地址+1就可以自动得到下一条指令的地址... -
函数调用时的参数传递研究(强烈推荐),该怎么处理
2021-05-20 04:59:39当前位置:我的异常网» C语言»函数调用时的参数传递研究(强烈推荐),该怎么处理函数调用时的参数传递研究(强烈推荐),该怎么处理www.myexceptions.net网友分享于:2013-02-04浏览:10次函数调用时的参数传递研究(强烈... -
C语言函数调用参数压栈顺序
2013-11-15 20:50:26很多人都知道,函数调用中,函数的参数是通过压栈出栈传递的。下面通过代码来验证压栈过程。 代码分两部分,参考了其他作者的代码后修改的。 1. 首先验证操作系统的栈的增长方向; 2. 汇编语言将参数压栈,然后... -
C语言函数的参数
2019-03-21 23:07:27代码说明:该函数的参数属于值传递,在调用该函数时,仅仅只是把实参的值拷贝了一份赋值给了形参x,之后的任何操作都不会影响到实参的值。 int8_t funcB(int8_t* x) { (*x)+=1; return (*x); } 代码说明:该函数... -
C语言函数调用常见问题(1)
2019-01-09 11:34:58在我看来 有许多计算问题如果通过函数调用方式来解决就会使得代码整体看起来简介又便于识别 但是在调用函数时候要注意以下几个问题 一、基本功能 1、函数调用,即把函数的输入值填进函数名后面的括号中,不需要注明... -
浅谈C语言函数调用与系统调用
2019-11-12 09:55:50很多初学C语言的同学,亦或者开发中很少接触系统底层的同学可能会认为函数调用以及系统调用是一回事。因为在应用程序,两者都被抽象成接口去给应用程序调用。其实函数调用和系统调用还是有区别,我们通过下图先有个... -
C语言实现函数调用的三种方法
2021-01-28 21:53:20在一个.c文件里面进行子函数调用 step1:函数声明 step:mian函数 step:子函数 /******************************** 数组元素之和 法一: 子函数调用 **********************************/ #include<stdio.h&... -
C语言函数参数传递详解
2021-06-02 11:00:201.值传递和指针传递 (1)值传递:即按值传递参数,是将实参变量的值复制一个到临时存储单元中,如果在调用过程中改变了形参的值,不会影响实参变量本身,即实参变量保持调用前的值不变 ... -
C语言函数调用的底层机制
2011-07-26 23:13:15C语言函数调用的底层机制C语言函数调用的底层机制C语言函数调用的底层机制C语言函数调用的底层机制C语言函数调用的底层机制C语言函数调用的底层机制 -
c语言函数的三种调用方式是什么
2021-05-22 01:22:33函数的三种调用方式:1、函数作为表达式中的一项出现在表达式中,例“z=max(x,y)”;2、函数作为一个单独的语句,例“printf("%d",a)”;3、函数作为调用另一个函数时的实参,例“printf("%d...函数调用的一般形式为... -
C语言之调用函数传递二维数组
2021-05-21 09:25:08转置二维数组的实例代码,探究二维数组作为参数的传递问题#include#define N 3int array[N][N];void main(){//在主函数内声明被调函数void convert(int array[][3]);int i,j;printf("输入数组:\n");for(j=0;jfor(i=0... -
C语言——函数调用(实参与形参)
2021-12-08 14:46:11而在主函数中调用一个函数时,函数后面括号中的参数称为“实际参数 ”。 实参和形参的数据传递 在调用函数时,实参的值传递给形参,后续用形参继续运行,且实参的值不改变,因为他们所占用的存储单元不一样。 ... -
C语言函数调用是怎么样一个过程?
2019-03-07 19:04:27大多数CPU上的程序实现使用栈来支持函数调用操作,栈被用来传递函数参数、存储返回信息、临时保存寄存器原有的值以备恢复以及用来存储局部变量。 函数调用操作所使用的栈部分叫做栈帧结构,每个函数调用都有属于...