C语言函数结果共有全局变量、函数返回值、传址参数三种带出方式。
通过参数表的参数传递是一种参数显示传递方式,而通过全局变量是一种隐式参数传递。
如果函数结果需要带出多个值,该怎样实现?可以采用全局变量方式带出或通过地址传递(数组方式、结构体方式、指针方式)方式带出来实现。
参考下面这段程序,
func1:采用全局变量和返回局部变量的值(注意不是地址!)
func2:采用采用静态局部数组(静态变量生命周期为定义起至程序结束,所以函数调用结束后仍可以被访问)
func3:采用指向动态内存的局部指针(动态内存的生命周期由程序员自己决定)
func4:采用结构体
func5:采用传址参数(地址传递参数、指针形参)
#include<stdio.h> #include<stdlib.h> typedef struct { int min, max; } Data; int MIN; //全局变量 /******************************** * 函数定义 ********************************/ int func1(int a[], int n) /* return返回最大值,MIN带回最小值 */ { int i, max; max=MIN=a[0]; for(i=1; i<n; i++) { if(a[i] > max) max = a[i]; if(a[i] < MIN) MIN = a[i]; } return max; } int *func2(int a[], int n) /* 将最大值、最小值放到数组b中,通过return返回 */ { static int b[2]; b[0] = b[1] = a[0]; int i; for(i=1; i<n; i++) { if(a[i]>b[0]) b[0] = a[i]; if(a[i] < b[1]) b[1] = a[i]; } return b; } Data *func3(int a[], int n) /* 将最大值、最小值放到结构体中,通过return返回结构体指针p */ { static Data *p; int i; p = (Data *)malloc(sizeof(Data)); //指针初始化 p->max = p->min = a[0]; for(i=1; i<n; i++) { if(a[i] > p->max) p->max = a[i]; if(a[i] < p->min) p->min = a[i]; } return p; } Data func4(int a[], int n) /* 将最大值、最小值放到结构体中,通过结构体p带回返回值 */ { Data p; int i; p.max = p.min = a[0]; for(i=1; i<n; i++) { if(a[i] > p.max) p.max = a[i]; if(a[i] < p.min) p.min = a[i]; } return p; } void func5(int a[], int n, int *p, int *q) /* 用指针带回结果,指针p指向最大值,指针q指向最小值 */ { int i; *p = *q = a[0]; for(i=1; i<n; i++) { if(a[i] > *p) *p = a[i]; if(a[i] < *q) *q = a[i]; } } /******************************** * 主函数 ********************************/ void main() { int a[10] = {1,3,9,8,4,2,5,0,7,6}, max, *p; Data *q; Data z; int x, y; max = func1(a, 10); printf("max=%d min=%d\n", max, MIN); p = func2(a, 10); printf("max=%d min=%d\n", p[0], p[1]); q = func3(a, 10); printf("max=%d min=%d\n", q->max, q->min); z = func4(a, 10); printf("max=%d min=%d\n", z.max, z.min); func5(a, 10, &x, &y); printf("max = %d min = %d\n", x, y); }
参考资料:《数据结构——用C语言描述(第2版)》p29
转载于:https://www.cnblogs.com/shujuxiong/p/10925240.html
