C语言函数怎么像python那样返回多个值?(三种方法:1、设置全局变量 2、传递指针 3、使用结构体返回不同类型的数据)
引用文章:c語言函數可不可以返回多個值
文章目錄
- 方法一:設置全局變量
- 例如:利用一個函數求出正方形的周長和面積。
- 方法二:使用數組名或指針作為函數的形參
- 實例2:編寫函數求一維整形數組的最大值與最小值,并把最大值與最小值返回給主調函數。
- 方法三:使用結構體指針作為函數的形參
- 實例3:編寫一個用戶自定義函數,允許用戶錄入學生的基本信息(包括學號、姓名、所屬班級、總評成績),并返回這些基本信息給主調函數。
- 結束語
C語言函數是不像python那樣支持多個返回值的,那么如果需要C語言函數實現多個返回值,有什么其他的辦法嗎?
在C語言中,一般情況下函數的返回值是通過函數中的return語句來實現的,每調用一次return語句只能從函數中返回一個值。但在實際很多應用中,我們需要從函數中返回多個值,那我們可以用什么方法實現呢?此時我們可以用三種方法來實現。
方法一:設置全局變量
全局變量是在函數外部定義的全局變量,它不屬于任何一個函數,其作用域是從變量的定義處開始,到本程序文件的結尾。在此作用域內,全局變量可為各個函數所引用。當我們需要函數返回多個值時,除了函數體中的return語句返回其中一個之外,其它的返回值我們可以通過定義全局變量來處理。因為根據全局變量的特點,在被調用函數中改變了多個全局變量和值,相當于其主調函數全局變量的值也發生了變化,也就相當于返回了多個值。
例如:利用一個函數求出正方形的周長和面積。
#include <stdio.h>double l = 0;//定義全局變量l為正方形周長double f(double a)//定義求面積和周長的函數 {double s;s = a * a;//求面積l = 4 * a;//求周長,并賦給全局變量lreturn s;//僅返回面積的值 }void main() {double a;double area;printf("請輸入邊長:");scanf_s("%lf", &a);area = f(a);//面積的值通過調用f函數返回值printf("面積為: %5.2lf\n",area);printf("周長為: %5.2lf\n",l);//周長即為全局變量l在f函數中改變后的值 }運行結果:
請輸入邊長:7 面積為: 49.00 周長為: 28.00上面的例子即用全局變量實現了函數中返回多值的情況,這種方式易懂。但是全局變量用多了會破壞代碼的安全性,結構性,這主要是全局變量在所有函數中都可以使用,從而其值的變化不確定,所以我們要慎用。
方法二:使用數組名或指針作為函數的形參
數組名或者指針實際為地址,而數組一般都包括多個元素,指針也可以指向一組數據的著地址,把數組名或者指針作為函數形參,實際上相當于主調函數的實參與形參共用地址,所以在函數中的數組元素發生改變即是實參也隨之改變。也相當于在調用函數時多個值返回給主調函數。
實例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];/*for (int i = 0; i < 6; i++) {printf("Please input the number %d, end with enter:\n", i);scanf_s("%d", &A[i]);}*/max_min(A, Min_Max, sizeof(A)/sizeof(A[0]));printf("min=%d, max=%d\n", Min_Max[0], Min_Max[1]);return 0; }結果:
min=1, max=9注意:該方法適用于多個返回值的數據類型一致的情況。當返回值數據類型不一致時,不適用該方法。
方法三:使用結構體指針作為函數的形參
編寫返回多個值的C語言函數,可以考慮采用結構體的方式去實現。如果返回的數個數值的數據類型不一致,可以通過定義全局變量實現有多個返回值的C語言函數,也可以考慮把要求返回的數個值定義成一個結構體,然后同樣以傳遞結構體指針方式把結構體的指針傳遞給形參結構體指針,那么函數中對形參結構體的修改即是對實參結構體的修改,函數被調用后獲取的實參結構體成員即為函數的多個返回值,下面以實例演示該方法的應用。
實例3:編寫一個用戶自定義函數,允許用戶錄入學生的基本信息(包括學號、姓名、所屬班級、總評成績),并返回這些基本信息給主調函數。
方法:把學生基本信息定義成一個結構體,在用戶自定義函數中傳遞該結構體的指針,則自定義函數中對結構體成員的錄入操作即是對實參結構體成員的錄入操作,從而實現多個返回值。參考代碼如下:
// Copyright (c) 2011 rubicon IT GmbH // Author: Dontla#include <stdio.h> #include <String.h>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學號:%s\n姓名:%s\n班別:%s\n總評成績:%d\n", 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 總評成績:585D:\Dontla_small_project\20210525_address_list\vs_test\vs_test\Debug\vs_test.exe (進程 34128)已退出,代碼為 0。 按任意鍵關閉此窗口. . .注意:當函數要求返回的多個值是相互聯系的或者返回的多個值數據類型不一致時可以采用該方法。
結束語
對于以上這三種方法,如果想要返回的數個值數據類型一致,可以考慮采用方法2;而對于不同數據類型的返回值,如果各個數值之間是相互聯系的,則方法3較為合適;方法1雖然在很多情況下都可以實現多個返回值的C語言函數,但畢竟全局變量應用過程中有很多危險,要慎重使用。
通過對以上幾種方法的分析講解,在教學過程中,學生再遇到這樣的問題時,就能根據返回值的情況選擇合適的途徑去實現多個返回值的C語言函數。另外,如果再遇到類似的無法用教材知識點去直接解決的問題時,他們基本都能舉一反三地嘗試采用間接方式去解決。
參考材料:
http://blog.csdn.net/supreme42/article/details/7636475
http://wenku.baidu.com/link?url=tJOYOInBS22mj0uJcYDEs0qZHFuCqiuhkKrrJNtoAYkffDnVIt6kiKusF491G2MVbDVzQGQgyAQ9moF3Og9v8Tt0Ny5jG05GgDmlwrhRs8K
總結
以上是生活随笔為你收集整理的C语言函数怎么像python那样返回多个值?(三种方法:1、设置全局变量 2、传递指针 3、使用结构体返回不同类型的数据)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: visual studio如何给源码文件
- 下一篇: 黑马程序员C语言基础(第六天)指针