函数的返回值存放在哪里

函数的返回值存放在哪里

调用函数时,函数的返回值存放的位置具体在哪里呢?按照概念来说,函数的返回值应该放在被调用函数运行结束之后,主调函数可以有效访问的地方,也就是说,函数返回值应当存放在主调函数开辟的栈空间

但是,计算机硬件的飞速发展使得CPU的通用寄存器字长在不断增长,个数也不断增多,因此在很多情况下,函数的返回值直接被存放在了CPU的通用寄存器中,而并非一定需要计算机的内存空间

具体类型的返回值的存放位置如下所示:

  • char(8bit):寄存器a1
  • short(16bit):寄存器ax
  • int(32bit):寄存器eax
  • double(64bit):协处理器堆栈
  • 指针、引用:寄存器eax
  • 类的对象且体积超过64bit:主调函数会在函数栈上创建临时对象存放
  • 8
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
第十章 函数 10.1 理解函数 C语言函数是程序中对分解与抽象思想的实现。C语言把大段的程序代码按照功能分解开,体现出对重复使用的程序段的抽象。 例:求任意两个正整数的最大公约数(GCD)和最小公倍数(LCM)。 /*求最大公约数用辗转相除法*/ #include<stdio.h> int main() { int i1,i2,i3,i4,gcd,lcm,temp; printf("Input i1 and i2:"); scanf("%d%d",&i1;,&i2;); i3=i1; i4=i2; temp=i2; while(temp!=0) { temp=i1%i2; i1=i2; i2=temp; } gcd=i1; lcm=i3*i4/gcd; printf("最大公约数:%d\n最小公倍数:%d\n",gcd,lcm); return 0; } 例:利用函数分解求任意两个正整数的最大公约数(GCD)和最小公倍数(LCM)。 /*利用函数分解求任意两个正整数的最大公约数(GCD)和最小公倍数(LCM)*/ #include<stdio.h> int gcd(int i1,int i2); int lcm(int i1,int i2); int gcd(int i1,int i2) { int temp; temp=i2; while(temp!=0) { temp=i1%i2; i1=i2; i2=temp; } return i1; } int lcm(int i1,int i2) { return i1*i2/gcd(i1,i2); } int main() { int i1,i2; printf("Input i1 and i2:"); scanf("%d%d",&i1;,&i2;); printf("最大公约数:%d\n最小公倍数:%d\n",gcd(i1,i2),lcm(i1,i2)); return 0; } C程序结构: (1)一个C程序可以由多个模块构成,每个模块可由若干个小模块构成,继续分解,直到分解成不可分割的最小模块单元为止,最小模块单元即为一个函数。C程序由多个函数构成。每个函数可以单独放在一个文件中,也可以将若干个功能相关的函数放在一个文件中,C语言程序可以由多个文件组成,文件负责组织存放若干函数。 (2)源程序文件是C程序的编译单位,每个文件单独编译,便于调试,方便团队开发。 (3)main函数是程序执行的入口,main函数可以调用其他函数,其他函数调用结束后要返回main函数,main函数执行完毕,整个程序就结束了。 (4)main函数可以出现在任何位置,其他函数的位置也不是强制的,每个函数有且仅有一个main函数。 (5)C程序的所有函数都是平行定义的,在一个函数内部不允许定义另外的函数函数可以互相调用,也可以调用自己,但是不能调用main函数。 10.2 函数定义和分类 10.2.1 函数定义 函数定义的一般形式: 1.无参函数的一般形式: 类型说明符 函数名() { 声明部分; 执行语句部分; } 例:输出当前时间。 #include<stdio.h> #include<time.h> /*showTime函数返回1979年1月1日0时0分0秒到当前的秒数*/ long showTime() { long lct; lct=time(0); /*time(0)返回1979年1月1日0时0分0秒到当前的秒数*/ return lct; } int main() { long lCurTime=showTime(); printf("%ld",lCurTime); return 0; } 函数函数首部和函数体两部分构成。 (1)函数首部 函数首部包括类型说明符、函数名、形式参数。类型说明符指明了函数的类型,函数的类型实际上是函数返回值的类型。函数名是由用户自定义的标识符,函数名后有一个括号,无参函数函数名括号中没有参数,但括号不可少。 (2)函数体 {}中的内容称为函数体。函数体包括声明部分和执行语句部分。声明部分对函数体内部用到的变量和函数的类型进行声明,执行语句部分是函数对数据进行加工完成函数功能的部分。 2.有参函数的一般形式: 类型说明符 函数名(形式参数表) { 声明部分; 执行语句部分; } 有参函数比无参函数多了形式参数表,形式参数表的格式为: 类型1 形参变量1,类型2 形参变量2,类型3 形参变量3,···,类型n 形参变量n 形参表中的变量称为形式参数,各参数之间用逗号间隔。在进行函数调用时,主调函数赋予形参实际的值。形参是变量,必须给以类型说明。 10.2.2 函数分类 从函数定义的角度看,函数可分为库函数和用户自定义函数。 (1)库函数:由C系统提供,用户无需定义,也不必在程序中作类型说明,只需在程序前包含该函数原型的头文件即可在程序中直接调用。如printf、scanf、sqrt等。 (2)用户定义函数:由用户按需要写的函数。对于用户自定义函数,不仅要在程序中定义函数本身,通常在主调函数模块中还必须对该被调函数进行类型说明,然后才能使用。被调函数与主调函数在同一文件中且被调函数在主调函数之前定义,可以不进行类型声明。 C语言的函数兼有其他语言中的函数和过程两种功能,可把函数分为有返回值函数和无返回值函数两种。 (1)有返回值函数:有返回值函数被调用执行完后向调用者返回一个执行结果,称为函数返回值。用户定义的需要返回函数值的函数,必须在函数定义和函数说明中明确返回值类型。 (2)无返回值函数:无返回值函数用于完成特定的处理任务,执行完成后不向调用者返回函数值。这类函数类似于其他语言的过程。用户定义无返回值函数时可指定函数的返回为“空类型”,空类型说明符为void。 例:输出当前时间。 #include<stdio.h> #include<time.h> /*showTime函数返回1979年1月1日0时0分0秒到当前的秒数*/ void showTime() { long lct; lct=time(0); /*time(0)返回1979年1月1日0时0分0秒到当前的秒数*/ printf("%ld",lct); } int main() { showTime(); return 0; }
好的,我明白了。以下是回答: 您的第一个问题是如何将总评成绩平均分以上的学生的等级确定为“均分以上”,同时将这些同学的对应信息存放在结构体数组h中,人数通过函数返回值得到。 为了回答这个问题,我们需要了解一些背景信息。假设我们已经有一个包含学生信息的结构体数组,每个结构体包含学生的姓名、学号、总评成绩等信息。我们还需要知道平均分是多少,假设平均分为avg。 为了确定哪些学生的总评成绩均分以上,我们可以遍历整个结构体数组,对于每个学生,如果其总评成绩大于等于平均分,则将其等级确定为“均分以上”,并将其信息存放在结构体数组h中。最后返回存放在h中的学生人数。 下面是一段示例代码,供您参考: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_STUDENTS 100 typedef struct { char name[20]; char id[20]; double score; char level[20]; } Student; int above_average(Student students[], int n, double avg, Student h[]) { int count = 0; for (int i = 0; i < n; i++) { if (students[i].score >= avg) { strcpy(students[i].level, "均分以上"); h[count++] = students[i]; } } return count; } int main() { // 假设我们已经有一个包含学生信息的结构体数组students,以及平均分avg Student students[MAX_STUDENTS]; double avg; // 假设我们已经从文件中读取了学生信息和平均分,并存放在students和avg中 // 初始化存放符合条件的学生信息的结构体数组h Student h[MAX_STUDENTS]; memset(h, 0, sizeof(h)); // 统计符合条件的学生人数,并将其信息存放在h中 int count = above_average(students, n, avg, h); // 输出符合条件的学生信息 printf("均分以上的学生有%d个:\n", count); for (int i = 0; i < count; i++) { printf("%s %s %.2f %s\n", h[i].name, h[i].id, h[i].score, h[i].level); } return 0; } ``` 希望这个回答能够解决您的问题。如果您还有其他问题,请随时问我。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值