C语言传回多个参数

c语言函数如何返回两个值或多个值(结合 小飞 电梯调度算法) 编写c语言函数 ,如何实现一个函数返回两个值 阅读详情
AI摘要

本文探讨了如何在C语言中突破常规,让函数返回多个值。通过指针结合数组、使用结构体以及高级的链表方法,介绍了实现这一功能的两种常见方式和原理。

在一般的C语言函数中,函数的返回值只能是一个值。那么可不可以让函数返回多个值呢,我们来讨论。为此,我们设置一个场景,计算两个数的和与差。

一、函数只能返回一个值

如下面的两个函数,一个是求和函数my_add(),一个是求差函数my_minus()函数。

实验一:只有一个返回值的函数求和差

代码如下:

/* one_return.c */
#include <stdio.h>
/* 求和函数 */
int my_add(int a, int b)
{
    int temp;
    temp = a + b;
    return temp;
}
/* 求差函数 */
int my_minus(int a, int b)
{
    int temp;
    temp = a - b;
    return temp;   
}

int main(void)
{
    int num_1,num_2;    // 保存操作数
    int ret;    // 保存结果
    char ope;   // 保存操方式

    printf("Enter number 1: ");
    scanf("%d", &num_1);
    printf("Enter number 2: ");
    scanf("%d", &num_2);
    printf("Enter operation way: "); // 输入操作方式
    scanf(" %c", &ope);

    switch(ope) {
        case '+':
            ret = my_add(num_1, num_2);
            break;
        case '-':
            ret = my_minus(num_1, num_2);
            break;
        default:
            break;
    }
    printf("----------------------------------------\n");
    printf("The result = %d\n", ret);

    return 0;
}

编译:

gcc one_return.c -o one_return.exe 

运行后结果为:

这里每个函数只能返回一个值,如果强行返回两个值,如下实验二。

实验二:强行返回两个值

代码如下:

/* multi_return_error.c */
#include <stdio.h>
/* 求和差函数*/
int my_add_minus(int a, int b)
{
    int temp1, temp2;
    temp1 = a + b;
    temp2 = a - b;
    return (temp1, temp2);
}
int main(void)
{
    int num_1,num_2;    // 保存操作数
    int ret;    // 保存结果

    printf("Enter number 1: ");
    scanf("%d", &num_1);
    printf("Enter number 2: ");
    scanf("%d", &num_2);

    ret = my_add_minus(num_1, num_2);
    printf("The result = %d\n", ret);

    return 0;
}

编译如下:

gcc multi_return_error.c -o multi_return_error.exe

编译过程没有任何错误:

但是执行效果如下:

返回的为temp2即a-b的值,这里实际返回的减法值。

这里是逗号表达式在作怪。看下面实验三。

实验三:逗号表达式
/* comma_expression.c */
#include <stdio.h>

int main(void)
{
    int a, b;
    int x = 12, y = 23, z = 34;
    a = (2,3,5,6);
    b = (x,y,z);

    printf("a = %d,  b = %d\n",a , b);

    return 0;
}

编译:

gcc comma_expression.c -o comma_expression.exe

执行为:

可以看到逗号表达式返回的是最后连缀起来的最后一个值。

如果我们将上面实验三中逗号表达式的括号去掉,如实验二的代码中函数my_add_minus()的return语句般书写,代码如下:

/* comma_expression_2.c */
#include <stdio.h>

int main(void)
{
    int a, b;
    int x = 12, y = 23, z = 34;
    a = 2,3,5,6;
    b = x,y,z;

    printf("a = %d,  b = %d\n",a , b);

    return 0;
}

此时,编译输出后为:

返回的是逗号中第一个值,这是由于赋值符号(=)的优先级高于逗号(,)其实如下代码:

a = 2,3,5,6;

返回的是逗号中第一个值,这是由于赋值符号(=)的优先级高于逗号(,)其实等效于如下代码:

(a = 2),3,5,6; 

是先将2赋值给a之后,在组成逗号表达式语句。

C语言中,优先级低于赋值运算符(=)的唯一一个运算符就是逗号运算符(,)。

现在我们的问题是,如果要得到多个返回值,要怎么处理?

二、函数返回多个值——方式一:指针+数组

我们现在利用指针方式,将加减乘除同时写入到一个函数中,其实就是建立这样一个int型数组,其中用于保存得到的和差积商,将数组地址作为参数传递。

数组中结构如下:

实验四:指针方式函数返回多个值

代码如下:

/* multi_return_array.c */
#include <stdio.h>
#include <malloc.h>
/* 返回和差积商函数 */
int *  my_return_by_array(int a, int b)
{
    int * ret_arr = (int *)malloc(4*sizeof(int));

    *(ret_arr + 0) = a + b;
    *(ret_arr + 1) = a - b;
    *(ret_arr + 2) = a * b;
    *(ret_arr + 3) = a / b;
    return ret_arr;
}
int main(void)
{
    int num_1,num_2;    // 保存操作数
    int * ret;    // 保存结果

    printf("Enter number 1: ");
    scanf("%d", &num_1);
    printf("Enter number 2: ");
    scanf("%d", &num_2);

    ret = my_return_by_array( num_1, num_2);
    printf("The result:\n%8d, %8d, %8d, %8d\n", ret[0], ret[1],ret[2],ret[3]);

    return 0;
}

编译,运行如下:

三、函数返回多个值——方式二:结构体

利用结构体的值传递特性,可以得到返回多个值的函数。

实验五:结构体方式函数返回多个值

代码如下:

/* multi_return_struct.c */
#include <stdio.h>

/* 定义保存和差积商的结构体 */
struct my_retrun {
    int sum;
    int defference;
    int product;
    int quotient;
};
/* 返回和差积商函数 */
struct my_retrun  my_return_by_array(int a, int b)
{
    struct my_retrun ret_struct;
    ret_struct.sum = a + b;
    ret_struct.defference = a - b;
    ret_struct.product = a * b;
    ret_struct.quotient = a / b;

    return ret_struct;
}
int main(void)
{
    int num_1,num_2;    // 保存操作数
    struct my_retrun ret;    // 保存结果

    printf("Enter number 1: ");
    scanf("%d", &num_1);
    printf("Enter number 2: ");
    scanf("%d", &num_2);

    ret = my_return_by_array( num_1, num_2);
    printf("The result:\n%8d, %8d, %8d, %8d\n", ret.sum, ret.defference, ret.product,ret.quotient);

    return 0;
}

编译运行:

四、结论

1、一般的函数只能返回一个值

2、如果要返回多个值,可以采用如下两种简单的方式,一个是指针+数组方式,一个是结构体方式。

3、更高级点的方法是采用链表方式。

C语言 PTA 因子之和通过指针变量间接传回主函数 C语言 PTA 因子之和通过指针变量间接传回主函数 因子之和通过指针变量间接传回主函数 (10分) 编写一个函数fun,功能是计算给定整数n的所有因子(不包括1和自身)之和,和值通过指针变量间接传回主函数。 函数接口定义: void fun(int n,int *m); 其中 n 和 m 都是用户传入的参数。函数计算给定整数 n 的所有因子(不包括1和自身)之和,和值通过指针变量 m 间接传回主函数。 裁判测试程序样例: #include <stdio.h> void fun(int 阅读详情

相关推荐

C语言函数参数传递的分析

C语言函数参数传递的分析

qq_44925149的博客 678

如何编写有多个返回值的C语言函数

1引言      笔者从事C语言教学多年,在教学中学生们常常会问到如何编写具有多个返回值的C语言函数。编写有多个返回值的函数是所有C语言教材里均没有提到的知识点,但在实际教学与应用的过程中我们都有可能会遇到这样的问题。有学生也尝试了不少方法:如把多个需要返回的值作相应的处理后变成一个可以用return语句返回的数据,再在主调函数中拆开返回的数据使之变成几个值;或者把需要返回多个值的一个函数

6万+

手把手教你用CubeMX给GD32F103点灯、调串口(附完整工程)

本文详细介绍了如何使用CubeMX为GD32F103开发板配置GPIO点灯和串口通信,包含完整的工程创建、代码构建和测试流程。特别强调了GD32与STM32的差异点及常见避坑技巧,帮助开发者快速上手GD32开发。

weixin_42566424的博客 313

04-C语言如何返回两个甚至多个值?

#include <stdio.h> //C的返回值只能是0个或者1个 void Zero() { printf("0\n"); } int One() { printf("1\n"); return 10; } //如何返回两个值? //rt1和rt2称为输出参数 void Two(int *rt1,int *rt2) { *rt1 = 10; *rt2 = 20; printf("%d%d\n",*rt1,*rt2); } int main() { int a,b;

LINZEYU666的博客 6393

深入解析CRC16查表法:从原理到Modbus协议实践

本文深入解析了CRC16查表法的核心原理与实现,重点阐述了其“空间换时间”的优化思想。通过对比直接计算法,详细说明了查表法如何通过预计算表格将计算速度提升数十倍,并提供了完整的Modbus CRC16查表法代码生成、解析及实战避坑指南,帮助开发者在嵌入式及工业通信场景中高效实现可靠的数据校验。

weixin_29166013的博客 555

大麦网抢票协议逆向分析:从Web安全到高并发风控实战

在当今高并发Web应用场景下,理解网络协议交互与反爬虫机制是后端开发和系统架构设计的核心技能。其基本原理涉及客户端与服务器之间通过HTTP/HTTPS协议进行数据交换,关键环节包括请求参数构造、身份认证与会话管理。这一技术的核心价值在于保障系统安全与公平性,通过动态令牌、签名算法及设备指纹等多重手段,有效抵御自动化脚本攻击。典型应用场景包括票务系统、电商秒杀等需要严格管控资源访问的高并发业务。本文以热门票务平台为例,深入剖析其**请求链与令牌体系**及**行为生物特征分析**等风控策略,通过实战演示协议逆向

weixin_34354173的博客 451

C语言基础知识:C语言函数调用怎么返回两个值

在C语言中,函数只能返回一个值,要返回两个值,可以改换思路,通过其它方式做到。 1 建立数组,返回指针。 在要返回的两个值类型相同时,可以用创建数组的方式,将要返回的值存在数组中,并返回数组首地址,这样就可以实现返回两个值的效果。 需要注意的是,要返回数组首地址,那么返回的值不可以是局部变量,有如下几种是可以的: a) 使用静态局部变量存储,并返回地址; b) 使用全局变量存储,返回地址; c...

baidu_37973494的博客 4万+

Java实现双色球&大乐透随机选号算法——原理详解与代码实战

掌握核心语法:集合操作、随机数生成、排序。贴近实际场景:将编程知识应用于生活问题的解决。

wangchl0932的博客 4974

C语言 函数返回多个值方法

学习总结,自用博客。

qq_45683300的博客 1万+

深度学习驱动材料科学:晶体生成与性质预测技术综述

深度学习作为人工智能的核心技术,通过模拟人脑神经网络处理复杂数据,在多个领域展现出强大的模式识别与生成能力。其原理在于构建多层非线性变换,从海量数据中自动学习特征表示与映射关系。这一技术价值在于能够高效处理高维、非结构化数据,解决传统方法计算成本高、探索空间有限的问题。在工程实践中,深度学习已广泛应用于计算机视觉、自然语言处理等领域,并正深刻变革材料科学的研究范式。具体到材料领域,它通过学习已知材料的构效关系,实现对新材料性能的快速预测与逆向设计。应用场景包括但不限于新能源材料、半导体、催化剂等领域的高通量

weixin_28695161的博客 414

【汇编实战开发笔记】一段汇编代码如何“反编译”成C代码?

介绍了一种由汇编代码得到C代码的方法

一个专注于嵌入式IoT领域的架构师,深耕IoT领域多年,深度掌握IoT领域的相关技术栈,包括但不限于RTOS内核的实现及其移植、硬件驱动移植开发、网络通讯协议开发、编译构建原理及其实现、底层汇编及编译原理、编译优化及代码重构、嵌入式IoT系统的架构设计等。 1万+

c语言中多个参数返回,C/C++如何设计函数多返回值?

有那么一种情况,函数本身需要返回多个值,如在地图参数中需要返回二维坐标(x,y),或者是系统设计中需要返回一个学生多门课程的成绩。这里提供了一些做法和思路。1. 全局变量,为什么不用它?如,这样的方法,当我们需要通过函数对多个值进行返回和传递的时候,可以使用一种弄虚作假的方式,就是使用全局变量,不需要函数返回,只需要在关键时刻进行设置就可以了。intx,y;voidgetWay(inta,i...

weixin_39621975的博客 614

TC3XX - MCAL知识点(二十七):SENT Mcal配置及代码实战(单边半字节传输协议)

SENT协议只有一根线,异步传输!Sent协议的全称为Single Edge Nibble Trans .isson,单边半字节传输协议,是一种单线异步串行通信协议。Sent报文包含8个Nibble和一个校准位如图1所示,每一个Nibble数据被编码成PWM方式。设计这种协议的目的是用在与汽车ECU快速交互信息的传感器上,以此来取代低精确度的10bit AD和PWM。Sent是一种点对点的单方向从传感器到控制端的协议,控制器不需要同步信号。

梦想技术家 2271

《C语言程序设计》江宝钏主编-习题8-2-指针参数传递多个返回值

AC代码: /*《C语言程序设计》江宝钏主编-习题8-2-指针参数传递多个返回值 Description 编写函数,其功能是对传送过来的两个浮点数求出和值与差值,并通过形参传回调用函数。 注意:此题用C语言完成时,必须使用指针方法处理,只提交头文件和 void compute(float a,float b,float *c,float *d) 函数,系统将自动附加下面的main函数后运行,...

qq_45599068的博客 844

C#实现Socket通信同时监听多客户端(附完整源码)

C#实现Socket通信同时监听多客户端(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 427

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

C语言数组作为函数参数

数组元素作函数实参 数组元素就是下标变量,它与普通变量并无区别。 因此它作为函数实参使用与普通变量是完全相同的,在发生函数调用时,把作为实参的数组元素的值传送给形参,实现单向的值传送。【例5-4】说明了这种情况。 【例8-7】判别一个整数数组中各元素的值,若大于0 则输出该值,若小于等于0则输出0值。编程如下: #include <stdio.h> void nzp(int v){ ...

violaaa_Li的博客 3583

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

c语言怎样用指针传回一个地址,关于C语言的指针传递地址的一些思考

我们在学习C语言的时候都会接触到关于指针的问题,大体我们都会知道指针在函数传递参数的过程中很灵活,我们可以将指针变量传递进去实现多个变量的值的改变,从而可以在一定程度上弥补我们的C函数返回值是一个变量的现象。在C Primer Plus中在指针的简介开始出是这么说的“究竟什么是指针?一般来讲,指针是一个数值为地址的变量”。我们总会去想指针是传递地址的,其实细想一下其实都是传的数值,比如我们定义两个...

weixin_42304279的博客 648

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

c语言参数传递与返回,C语言中函数参数传递方式与返回值的探讨

本文分析了C语言中函数参数的传递方式与函数返回值之间的关系,并总结了返回多个返回值的方法。第2 9卷第 4期V 12 N . 0.9 o4长春师范学院学报 (自然科学版 )Ju a o hneu o a U i rt N tr c ne or l f aghnN r l n e i{ a a Si c) n C m v sy u l e21 00年 8月Au . 0 0 g2 1C语言中函数...

weixin_29612623的博客 771

c语言参数传递过程并分析结果,C语言函数参数传递的分析

一、值传递和指针传递的概念(一)值传递值传递,即按值传递参数,按值传递参数时,是将实参变量的值复制一个到临时存储单元中,如果在调用过程中改变了形参的值,不会影响实参变量本身,即实参变量保持调用前的值不变。1、形参只能是变量,实参可以是常量、变量或表达式。在被定义的函数中,必须指定形参的类型。2、实参与形参的个数应一样,类型应一致。字符型和整型可以互相通用。4、实参传递给形参是实参的值,形参变量在未...

weixin_32954401的博客 1505

C语言参数传递

C语言参数传递方式有传值和传地址两种方式。        1、传值方式         原理:形参和实参占不同内存单元,传递的实际上是实参变量或表达式的一个拷贝副本,将这个副本值传给形参,形参内存单元内容保存的正是这个副本值,相当于给形参进行初始化,形参的值发生变化也不会传回给实参,因此是单向传递。        例如:                 void increase(int

charliezheng198893的专栏 3246

函数c语言如何传参数,C语言函数参数传递规律

摘要:C语言的模块设计主要是通过函数实现的,函数间信息的传递主要是通过参数实现的。函数的参数传递包括传值和传址。为了区别两种传递方式的不同,采用实例和图示两种方法,列举了变量、数组名、指针作参数的实例,通过比较函数调用后形参和实参的变化,总结出函数调用时参数传递的两种规律,即基类型变量、数组元素、结构体变量作参数时是传值,也就是单向的值传递;数组名、指针作参数时是传址,也就是共享同一个地址。关键词...

weixin_39853131的博客 294

C语言不变值变量函数,C语言函数参数传递的分析

一、值传递和指针传递的概念(一)值传递值传递,即按值传递参数,按值传递参数时,是将实参变量的值复制一个到临时存储单元中,如果在调用过程中改变了形参的值,不会影响实参变量本身,即实参变量保持调用前的值不变。1、形参只能是变量,实参可以是常量、变量或表达式。在被定义的函数中,必须指定形参的类型。2、实参与形参的个数应一样,类型应一致。字符型和整型可以互相通用。4、实参传递给形参是实参的值,形参变量在未...

weixin_39666931的博客 1112

C语言的本质(16)——函数接口的传入参数与传出参数

如果函数接口有指针参数,既可以把指针所指向的数据传给函数使用(称为传入参数),也可以由函数填充指针所指的内存空间,传回给调用者使用(称为传出参数),例如strcpy的函数原型为 char *strcpy(char *dest, const char *src);其中src参数是传入参数,dest参数是传出参数。有些函数的指针参数同时担当了这两种角色,如select函数。其函数原型为:int sel

尹成的技术博客 9975

c语言参数不能但单向传递,基于C语言数组名作函数参数问题的分析研究

C基于C语言数组名作函数参数问题的分析研究强伟,杨战海(延安大学陕西延安716000)摘要:在研究数组名作函数参数时,提出参数形式的一致性问题和数据的传递方向问题。综合分析参数的匹配原则、数据的传递规律、数组名的约定和下标运算符,从理论上探讨数组参数与指针参数的关系。结合程序验证表明,数组参数本质上为指针参数,即数组参数和指针参数是完全等价的两种形式,参数的数据传递依然为单向值的传递,并非是双向数...

weixin_28871743的博客 306

C语言函数传入字母参数,C语言函数参数传递规律

C语言函数参数传递规律导语:C语言的模块设计主要是通过函数实现的,函数间信息的传递主要是通过参数实现的。函数的参数传递包括传值和传址。下面就由小编为大家介绍一下C语言函数参数传递规律,欢迎大家阅读!1、参数的传递方式C语言函数的参数传递可以归纳为两种方式:传值和传址。下面用实例和图示两种方式进行描述。1.1传值传值传递方式主要出现在实参和形参都是变量的时候,如基类型变量、数组元素、结构体变量作参数...

weixin_42525178的博客 296
上一篇: c语言中malloc函数的一个陷阱(二级指针的使用)
金达南
博客等级 码龄3年 137粉丝 12原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值