C语言中函数的一些基本内容

这里主要为大家介绍函数的定义声明参函数调用的基本概念以及变量名作函数参数的程序设计方法

一、函数的定义声明参函数调用的基本概念

1. 函数定义:

	return_type function_name( parameter list )
	{
   		//body of the function
   	}

2. 函数声明:

函数声明会告诉编译器函数名称及如何调用函数。函数的实际主体可以单独定义。
函数声明包括以下几个部分:

return_type function_name( parameter list );

针对上面定义的函数 max(),以下是函数声明:

int max(int num1, int num2);

在函数声明中,参数的名称并不重要,只有参数的类型是必需的,因此下面也是有效的声明:

int max(int, int);

函数调用:
创建 C 函数时,会定义函数做什么,然后通过调用函数来完成已定义的任务。

#include <stdio.h>
/* 函数声名 */
int themax(int num1,int num2);
int main() {
	/* 局部变量定义 */
	int a = 100;
	int b = 200;
	int ret;
	/* 调用函数来获取最大值 */
	ret = themax(a , b);
	printf("最大值是:%d\n",ret);
	return 0;
}
/* 函数返回两个数中较大的那个数 */
int themax(int num1,int num2) {
	/* 局部变量声名 */
	int result;
	if(num1 > num2)
	        result = num1; 
	else
	        result = num2;
	return result;
}

二、函数实参与形参的对应关系以及参数的传递.

1. C语言的传值方式调用函数:

/* 函数定义 */
void swap(int x,int y)
{
    int temp;

    temp = x;  /* 保存x的值 */
    x = y;  /* 把y的值赋给x */
    y = temp;  /* 把temp的值赋给y */

    return;
}
#include <stdio.h>
/* 函数定义 */
void swap(int x,int y) {
	int temp;
	temp = x;
	/* 保存x的值 */
	x = y;
	/* 把y的值赋给x */
	y = temp;
	/* 把temp的值赋给y */
	return;
}
/*函数声明*/
void swap (int x, int y);
int main() {
	/*局部变里定义*/
	int a =100;
	int b= 200;
	printf("交换前,a的值:%d\n",a);
	printf("交换前,b的值:%d\n",b);
	/*调用函数来交换值*/
	swap(a, b);
	printf("交换后,a的值:%d\n",a);
	printf("交换后,b的值:%d\n",b);
	return 0;
}

当上面的代码被编译和执行时,它会产生下列结果:
在这里插入图片描述
上面的实例表明了,虽然在函数内改变了 a 和 b 的值,但是实际上 a 和 b 的值没有发生变化。把参数的实际值复制给函数的形式参数。在这种情况下,修改函数内的形式参数不会影响实际参数。

2. C语言的引用方式调用函数:

通过引用传递方式,形参为指向实参地址的指针,当对形参的指向操作时,就相当于对实参本身进行的操作。
传递指针可以让多个函数访问指针所引用的对象,而不用把对象声明为全局可访问。
变量在编译的时候系统要为它分配一个地址,如用另一个变量来存放这个地址,那么这个变量就叫指向变量的指针变量。
在这里插入图片描述

#include <stdio.h>
/* 函数定义 */
void swap(int *x,int *y) {
	int temp;
	temp = *x;
	/* 保存地址x的值 */
	*x = *y;
	/* 把y赋值给x */
	*y = temp;
	/* 把temp值赋给y */
	return;
}
/*函数声明*/
void swap (int *x, int *y);
int main() {
	/*局部变里定义*/
	int a =100;
	int b= 200;
	printf("交换前,a的值:%d\n",a);
	printf("交换前,b的值:%d\n",b);
	/* 调用函数来交换值
	* &a表示指向a的指针,即变量a的地址
	* &a表示指向a的指针,即变量a的地址
	*/
	swap(&a, &b);
	printf("交换后,a的值:%d\n",a);
	printf("交换后,b的值:%d\n",b);
	return 0;
}

当上面的代码被编译和执行时,它会产生下列结果::在这里插入图片描述

三、利用函数的构造,完成一些数学公式的模拟.

1. 根据输入的整数x和n,利用函数fact实现求xn。 例如:输入:2,3 输出23=8

/*  利用函数fact实现求x的n次方*/
#include "stdio.h"
int main() {
	long int  fact(long x,long n) ;
	/*声明fact函数*/
	long int  x ;
	long int  n;
	printf("请输入x和n(>=0)的值,以逗号分割: ");
	scanf("%ld,%ld", &x, &n );
	printf("%ld,%ld,%ld",x,n,fact(x,n));
	/*调用fact函数 */
	return 0;
}
long int  fact(long int x, long int n)
{	/*定义fact函数求x^n */ 
	long int  i,s;
	s=1;
	/*求累积变量的初始化*/
	if (n==0)  return 0;
	for (i=1; i<=n; i++)
	/*用循环实现x^n*/
	s=s*x;
	return s;
	/*返回结果x^n*/
}

运行截图:
在这里插入图片描述

2. 计算 C m n C_m^n Cmn= m ! n ! ∗ ( m − n ) ! \frac{m!}{n!*(m-n)!} n!(mn)!m! 的值,例如:输入:5,3 输出: C m n C_m^n Cmn=10

定义求阶乘函数,在此基础上定义求组合数函数。
主函数调用求组合数函数,求组合数函数再三次调用求阶乘函数。

/*      利用函数组合数*/
#include "stdio.h"
long int  jf (int  n)                         
{	/*定义求阶乘函数jf*/
	int  i;
	long int  t=1;
	for (i=1; i<=n; i++)
	    t*=i;
	return t;
}
long int  cmn(int  m, int  n)           
{	/*定义求组合数函数cmn*/ 
	return(jf(m)/(jf(n)*jf(m-n)));
}
/*用return语句返回结果*/
int main( ) {
	int m,n;
	printf("请输入m和n的值,空格隔开: ");
	scanf("%d %d", &m, &n );
	printf("%ld",cmn(m,n));
	return 0;
}

运行结果:
在这里插入图片描述

3. 读入一个整数m,计算如下公式的值: t = 1 + 1 2 \frac{1}{2} 21 + 1 3 \frac{1}{3} 31 + … + 1 m \frac{1}{m} m1,若输入5,则应输出:“计算结果是 2.28333”。

/*  利用函数实现级数求和  */
#include "stdio.h"
double fun(int m) {
	float t=1.0;
	int i;
	for (i=2; i<=m; i++)
	   t += 1.0/i;
	return t;
}
int main() {
	int m;
	printf("请输入一个整数值:");
	scanf("%d",&m);
	double fun(int m);
	printf("计算结果是:%f",fun(m));
	/*按照例子中的输出形式输出结果*/
	return 0;
}

运行结果:
在这里插入图片描述

四、总结.

  1. 定义函数时,函数名后的圆括号后面不能加“;”
  2. 在函数体内,不能再对形参进行定义和说明
  3. 变量作实参时,只使用变量名,实参变量对形参变量的数据传递是“值传递”
  4. 一维数组作函数的实参时,只使用数组名如:fun(a);
    例如:下面对函数的调用都是不正确的:
    fun(int a[4]);
    fun(int a[ ]);
    fun(int a);
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值