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