一般情况下,我们封装的函数一般只返回一个返回值,但是有些特殊情况下函数需要返回多个值。本文总结出来几种方式供大家参考:
三种返回方式分类 1.全局变量法【慎用】由于全局变量的作用域是从定义变量开始直到程序结束,而对于编写有多个返回值的C语言函数,我们可以考虑把要返回的多个值定义成全局变量。当函数被调用时,全局变量被更改,我们再把更改后的全局变量值应用于主调函数中。函数被调用后被更改后的全局变量值即为函数的数个返回值。
#include#include int max,min;//定义两个全局变量用于保存函数的返回值 void max_min(int a,int b) { max=min=a; max=(a>b)?a:b; min=(a 2.使用数组名或指针作为函数的形参 数组名或者指针实际为地址,而数组一般都包括多个元素,指针也可以指向一组数据的着地址,把数组名或者指针作为函数形参,实际上相当于主调函数的实参与形参共用地址,所以在函数中的数组元素发生改变即是实参也随之改变。也相当于在调用函数时多个值返回给主调函数。
2.1例子: 【传递数组的方式】void ShuZu_C_Tow_function(int C[],int B[]) { int i; for(i=0;i<4;i++) { C[i] = C[i]*B[i]; //对C和B进行赋值处理 } } void MainWindow::on_pushButton_5_clicked() { int C[4],B_[6];int m;//定义三个变量 C和B_是用来传参的 m用来计数 memset(B_,0,sizeof(B_)); memset(C,0,sizeof(C));//对两个变量清零赋值 for (m=0;m<4;m++) {//对两个变量赋初始值 C[m] = m+1; B_[m] = m+1; } ShuZu_C_Tow_function(C,B_); for(int i=0;i<4;i++) { qDebug()<2.2传递指针的方式进行传值 以指针方式传递该一维数组A的地址,再传递一个保存最大值最小值的数组Min_Max的地址,再把数字数组的大小n传过去。然后在函数里用for循环逐个比较求出最大值最小值,存到Min_Max中:
#include "stdio.h" void max_min(int* A, int* Min_Max, int n) { //实参和形参同名没啥关系 Min_Max[0] = A[0]; Min_Max[1] = A[0]; for (int i = 1; i < n; i++) { if (A[i] < Min_Max[0]) { Min_Max[0] = A[i]; } else if (A[i] > Min_Max[1]) { Min_Max[1] = A[i]; } } } int main() { int A[6] = {3,2,4,9,1,7}; int Min_Max[2]; //调用的格式如下 A Min_Max 是数组 max_min(A, Min_Max, sizeof(A)/sizeof(A[0])); printf("min=%d, max=%dn", Min_Max[0], Min_Max[1]); return 0; }2.3采用return的方式返回一个指针【指针函数】int *funcPuls() { // static int p[3] = {1,50,32}; // return p; //动态申请内存 p在这里指向了一块合法内存的地址 int *p = (int*)malloc(sizeof(int)); *p = 1; *(p+2) = 20; *(p+1) = 30; return p; } int *func_(){ static int n = 10; return &n; } int *MainWindow::func() { //这个地方可以是指针 可以是数组 static int p[3] = {1,50,32}; return p; } void MainWindow::on_pushButton_3_clicked() { int *s = func(); for (int i = 0;i<3;i++) { qDebug()<<*(s+i)<<"-----"; } int *s1 = func_(); qDebug()<<*(s1)<<"-++--"; int *x = funcPuls(); for (int i = 0;i<3;i++) { qDebug()<<*(x+i)<<"+++++"; } } 1 ----- 50 ----- 32 ----- int *funcPuls()的返回值 10 -++-- int *func_() 1 +++++ 30 +++++ 20 +++++ int *MainWindow::func()3.采用结构体的方方法: 3.1采用结构体+指针把学生基本信息定义成一个结构体,在用户自定义函数中传递该结构体的指针,则自定义函数中对结构体成员的录入操作即是对实参结构体成员的录入操作,从而实现多个返回值。参考代码如下:式发送
// Copyright (c) 2011 rubicon IT GmbH // Author: Dontla #include3.2采用return+结构体的方式#include struct student { //定义学生结构体,分别包含成员学号、姓名、班别、总评成绩 char stuNo[12]; char stuName[20]; char classNo[15]; int totalScore; }; int main() { struct student student1; //定义学生结构体类型变量 printf("请输入学号,姓名,班别,总评成绩,以空格隔开:n"); void logInfo(struct student* ptr);//因为函数写在main函数后面,所以要声明 logInfo(&student1);//调用函数,以学生结构体类型变量地址作为实参 printf("n学号:%sn姓名:%sn班别:%sn总评成绩:%dn", student1.stuNo, student1.stuName, student1.classNo, student1.totalScore); return 0; } void logInfo(struct student* ptr)//该函数实现对结构体成员数据的录入操作 { char stuNo[12] = { 0 }, stuName[20] = { 0 }, classNo[15] = {0}; //如果不全初始化为零,strcpy_s函数会提示可能没有为字符串添加字符串零终止符 int totalScore; scanf_s("%s %s %s %d", &stuNo, sizeof(stuNo), &stuName, sizeof(stuName), &classNo, sizeof(classNo),&totalScore); strcpy_s(ptr->stuNo, stuNo); strcpy_s(ptr->stuName, stuName); strcpy_s(ptr->classNo, classNo); ptr->totalScore = totalScore; } =====================================运行结果===================================== 请输入学号,姓名,班别,总评成绩,以空格隔开: 13331333 nana 4 585 学号:13331333 姓名:nana 班别:4 总评成绩:585 #includetypedef struct more{//结构体 int one; int two; }more; more re() { more m = {1,2}; return m; } int main() { more m = re(); printf("%d %d",m.one,m.two); return 0; }



