2.C语言函数

函数的分类

1.库函数

2.自定义函数

一.库函数

库函数是由C语言提供的吗?

不是的,C语言提供了库函数的标准,由各厂商实现

C语言对函数的标准规定

那strlen函数举例

1.函数的功能  :求字符串长度的

2.函数名:strlen

3.函数参数:const  char*

4.返回类型   size_t

举例关于库函数使用的

1.pow函数

由图可知pow函数 的返回类型是double型,参数类型也是double型。头文件是math.h


//pow函数的返回类型是double型,参数类型也是double型
//在使用时需要头文件<math.h>
#include<math.h>
int main()
{
	int n = (int)  pow(2, 5);
	//pow的返回类型是double但是n是int型所以需要(int)进行强制类型转换
	//pow(2,5)表示2的5次方
	double x = pow(2, 5);
	printf("%d\n%lf\n", n, x);
	return 0;
}

2.strcpy函数

strcpy函数的返回类型和参数类型都是char,头文件是string.h


//strcpy函数的返回类型和参数都是char类型使用时需要头文件<string,h>
#include<string.h>
int main()
{
	char arr1[20] = { "*****************" };
	char arr2[] = { "i am handsome" };
	strcpy(arr1, arr2);
	//strcpy函数中把arr2中的字符复制到arr1中包括\0
	//arr2中包括\0一共14个字符,但是arr1中有17个*
	//所以arr1中未被复制的部分依然有*,只是遇到\0不再打印,arr1的数组大小不变

	printf("%s\n", arr1);

	return 0;
}

3.memsrt函数

void * memset ( void * ptr, int value, size_t num )

memsrt函数返回值为空,需要头文件string.h

//memset函数返回值为空,需要头文件<string.h>
#include<string.h>
int main()
{
	char arr[] = { "hellow  C" };
	memset(arr, 'c', 5);
	//'c'表示把数组中其他字符替换成'c',5表示要替换的字符个数
	//hellow C前五个字符被字符c替换
	printf("%s\n", arr);
	return 0;
}

二.自定义函数

2.1函数的组成

返回类型   函数名(参数类型 参数)

{函数体}

以一个简单的函数为例

int sum(int x, int y);//函数声明
int main()
{
	int a = 5, b = 3;
	int rst = sum(a, b);//函数调用
	printf("%d\n", rst);
	return 0;
}
int sum(int x, int y)//函数定义
{
	return x + y;
}

2.11写一个函数可以找出两个整数中的最大值。

利用传值调用

int max(int x, int y)
{
	if (x >= y)
	{
		return x;
	}
	else
	{
		return y;
	}
}

int main()
{
	int a = 0, b = 0;
	scanf("%d %d", &a, &b);
	int rst = max(a, b);
	printf("最大值是%d\n", rst);
	return 0;
}

2.12写一个函数可以交换两个整形变量的内容。

利用传址调用

void fun(int* x, int* y)
{
	int t = 0;
	t = *x;
	*x = *y;
	*y = t;
}

int main()
{
	int a = 0, b = 0;
	scanf("%d %d", &a, &b);
	fun(&a, &b);
	printf("%d %d\n", a, b);
	return 0;
}

把a和b的地址传递给x和y,*是解引用操作符,通过x和y中的地址来找到该地址所存储的变量

2.2函数的参数

2.2.1实际参数

真实传递给函数的参数,也叫实参

实参可以是常量,变量,表达式,函数等。

无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传递给形参。

2.2.2形式参数(形参)

形参指的是函数的函数名后括号中的变量,因为形参只有在被调用过程中才会被实例化(分配内存单元),形式参数在函数调用时建立,函数调用完成之后就自动销毁了。因此形参只在函数中有效、

3.函数的调用

3.1传值调用

函数的形参和实参分别占有不同的内存块,对形参的修改不影响实参。

3.2传址调用

形参和实参依旧占有不同的内存块,但形参的变量内容就是实参的地址,通过*这个解引用操作符来找到该地址引用的变量

传址调用就是把函数外部创建变量的内存地址传递给函数参数的一种调用方式

这种传参方式可以让函数外边的变量和函数真正建立联系,即函数内部可以直接操作函数外部的变量。

修改函数外部的值时需要传址调用,即传递的值是地址。

4.函数的嵌套调用和链式访问

4.1函数的嵌套调用

void fun1()
{
	printf("hehe C\n");
}


void fun2()
{
	printf("hellow C\n");
	fun1();//在fun2函数内调用fun1函数
}

int main()
{
	fun2();
}

4.2函数的链式访问

把一个函数的返回值作为另外一个函数的参数。

5.函数的声明,定义和调用

1. 告诉编译器有一个函数叫什么,参数是什么,返回类型是什么。但是具体是不是存在,函数

声明决定不了。

2. 函数的声明一般出现在函数的使用之前。要满足先声明后使用。

3.函数的定义是指函数的具体实现,交待函数的功能实现


//当函数定义在函数调用前面时不需要用函数声明
int add(int x, int y)//函数定义
{
	return x + y;
}
int main()
{
	int a = 0, b = 0;
	scanf("%d %d", &a, &b);
	int rst = add(a, b);//函数调用
	printf("%d\n", rst);
	return 0;
}
//当函数定义在函数调用后面时必须要有函数声明
int add(int x, int y);//函数声明
int main()
{
	int a = 0, b = 0;
	scanf("%d %d", &a, &b);
	int rst = add(a, b);//函数调用
	printf("%d\n", rst);
	return 0;
}



int add(int x, int y)//函数定义
{
	return x + y;
}

  • 27
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值