20201130-C语言-传值和传址,参数封装

示例1

/*
函数
	库函数stdio.h stdlib.h
		printf(参数列表) printf("格式化字符串%d%d%d",参数列表)
		scanf()
		exit()
		fprintf()
		fscanf()
		fputc()
		fgetc()
		fwrite()
		fread()
	自定义函数
		返回类型 函数名(参数列表);
			参数:
				入口参数,吃进去
				出口参数,吐出来
				返回值,拉出来
			何时用出口参数,何时用返回值?
			1. 返回值的用法?
			2. 返回值只有一个,出口可以N个

		多参数的情况下,对接口进行标准化的封装
			使用结构体
			使用typedef给别名
			指针的指向

		int sum(int a, int b);
*/
#include <stdio.h>

typedef struct inputArgu
{
    
    
	int a;
	int b;
} INARGU;
typedef struct outputArgu
{
    
    
	int sum;
	int mul;
	int sub;
	int div;
} OUTARGU;

float sumF(float a,float b);
double sumI(int a, int b);
void mySum(int a,int b,int *sum,int *mul,int *sub,int *div);
/*
封装可以让接口更简单,让业务突显
现实业务一定是包装过的数据类型 
*/
void mySum1(INARGU in,OUTARGU *out);
void mySum2(INARGU in,OUTARGU *out);


/*
	保持 主调函数的 简洁性
*/
int main(void)
{
    
    
	int x=11, y=12;

	INARGU in;
	OUTARGU out;

	in.a = x;
	in.b = y;

	//mySum1(in,&out);
	mySum2(in,&out);

	printf("sum=%d,mul=%d,sub=%d,div=%d",out.sum,out.mul,out.sub,out.div);
	return 0;
}

double sumI(int a, int b)
{
    
    
	// 强调 ,为了保证精度,一定要先转换,再运算
	return (double)a+(double)b;
	// return (double)(a+b);
}

float sumF(float a,float b)
{
    
    
	return a+b;
}

void mySum(int a,int b,int *sum,int *mul,int *sub,int *div)
{
    
    
	// 副作用
	*sum = a+b;
	*mul = a*b;
	*sub = a-b;
	*div = a/b;
}


void mySum1(INARGU in,OUTARGU *out)
{
    
    
	(*out).sum = in.a + in.b;
	(*out).mul = in.a * in.b;
	(*out).sub = in.a - in.b;
	(*out).div = in.a / in.b;
}

void mySum2(INARGU in,OUTARGU *out)
{
    
    
	out->sum = in.a + in.b;
	out->mul = in.a * in.b;
	out->sub = in.a - in.b;
	out->div = in.a / in.b;
}

示例2

/*
	数组初始化

	1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
	入口参数,传值
	出口参数,传址【可以回传数据,产生副作用】

	数值名就是地址,传数组名就是传地址
*/

#include <stdio.h>
#include <stdlib.h>

#define N 15

// 初始化数组
void initArr(int *a,int cnt);
// 显示数组
void showArr(int *a,int cnt);
// 求元素的和
void getSumOfArr(int *a,int cnt,int *sum);
// 求元素的均值
void getAverOfArr(int *a,int cnt,double *aver);



int main(void)
{
    
    
	int arr[N];
	int cnt;
	int sum;
	double aver;

	printf("please input cnt<%d: ",N);
	scanf("%d", &cnt);

	printf("please input %d datas: ",cnt);
	initArr(arr, cnt);

	printf("show Arr:\n");
	showArr(arr, cnt);

	// 本质上,要回传数据,一定要传地址,要使用数据,只需要传值
	getSumOfArr(arr, cnt, &sum);
	printf("sum of all datas for Arr:%d\n",sum);

	getAverOfArr(arr, cnt, &aver);
	printf("sum of all datas for Arr:%.2lf\n",aver);

	printf("\n");
	
	return 0;
}


void initArr(int *a,int cnt)
{
    
    
	int i;
	for(i=0;i<cnt;i++)
	{
    
    
		scanf("%d", &a[i]);
	}
}
void showArr(int *a,int cnt)
{
    
    
	int i;
	for(i=0;i<cnt;i++)
	{
    
    
		printf("%3d ",a[i]);
		if((i+1)%5==0)
		{
    
    
			printf("\n");
		}
	}

}

void getSumOfArr(int *a,int cnt,int *sum)
{
    
    
	int i;
	*sum = 0;
	for(i=0;i<cnt;i++)
	{
    
    
		*sum += a[i];
	}
}

/*
	理解上,不要死扣这里的a一定是一个数组,本质上,它只是传了一个地址,所以使用指针
	正好数据名就是一个地址,也就是一个指针
*/
void getAverOfArr(int *a,int cnt,double *aver)
{
    
    
	int sum;
	getSumOfArr(a,cnt,&sum);
	*aver = (double)sum / cnt;
}

猜你喜欢

转载自blog.csdn.net/matrixbbs/article/details/111353364