C语言学习笔记-函数

1.函数的概念:

**

函数,有些翻译成子程序。

c语言中的函数就是完成某项特定任务的**一小段代码**。同时,一个函数如果能完成某项特定任务的话,这个函数是可以复用的。提升了软件开发的效率。

在c语言中,我们一般会见到两类函数。

(1)库函数------现成的函数,可以直接使用。

(2)自定义函数----自己定义的函数

**

2. 库函数

**

2.1标准库和头文件

标准库: 约定了常用函数的标准。

printf: 不去实现,只规定标准。

功能:在屏幕上打印信息

参数:xxxxxx

返回值:xxxxx

 2.2库函数的使用方法

sqrt:计算平方根--------要包含头文件 <math.h>

double r=sqrt(16.00000);
printf("%lf",r);

在这里插入图片描述

**

3. 自定义函数

**

3.1函数的语法形式
ret_type  fun_name(形式参数){
函数体
}

ret_type:是函数返回类型

fun_name:是函数名

函数返回类型有两类:● void-表示什么都不返回

			 ●其他  int char short ...

3.2函数的举例:

写一个加法函数,完成2个整型变量的加法操作。

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<math.h>
int Add(int x, int y)//形式上的参数  简称形参。
{
	int z = 0;
	z = x + y;                                     return  x+y;
	return z;
}
int main() {
int a = 0;
	int b = 0;
	scanf("%d %d", &a, &b);
	int c = Add(a, b); //a和b是真实传递给Add的参数,是实际参数,简称实参。
	printf("%d", c);
		return 0;
	}

**

4. 实参和形参

**

实参:真正传递给函数的参数 形参:只有在函数被调用的过程中为了存放实参传递过来的值,才向内存申请空间,这个过程叫形参的实例化。

我们可以理解为形参是实参的一份临时拷贝。

**

5. return语句

**

●return后边可以是一个值也可以是一个表达式。

●return后边也可以什么都没有,直接写return;这种写法适合函数返回类型是void的情况。(可以结束这个函数)---不能用break;(是循环)

●return返回的值和函数返回类型不一样,系统会自动将返回的值隐式转换为函数的返回类型。

●如果函数存在if等分支的语句,则要保证每种情况下都有return返回,否则会出现编译错误。

**

6. 数组做函数参数

**

●形参与实参的个数要匹配。

●函数实参是数组,形参也可以是数组。

●形参如果是一维数组,数组大小可以省略不写。

●形参如果是二维数组,行可以省略,列不能省略。

写一个函数对整型数组,里的内容全部设置成-1.
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<math.h>
void set_arr(int arr[], int sz) {
	int i = 0;
	for (i = 0; i < sz; i++) {
		arr[i] = -1;
	}
}
void printf_arr(int arr[], int sz) {
	int i = 0;
	for (i = 0; i < sz; i++) {
		printf("%d", arr[i]);
	}
}
int main() {
int arr[] = {1,2,3,4,5,6,7,8,9,10};
	//先写一个函数,将arr内的元素全设置成-1
	int sz = sizeof(arr) / sizeof(arr[0]);
	set_arr(arr, sz);
	printf_arr(arr, sz);
		return 0;
	}

在这里插入图片描述

二维数组的传参:在这里插入图片描述

**

7. 嵌套调用和链式访问

**

假设计算某年某月有多少天?

is_leap_year():根据年份确定是否是闰年

get_days_of_month():确定是否是闰年后,再根据月计算这个月的天数

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<math.h>
int is_leap_year(int y) {
	if ((y % 4 == 0 && y % 100 != 0) || (y % 400 == 0))
		return 1;
	else
		return 0;
}
int get_days_of_month(int y,int m) {
	int days[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
	int d = days[m];
	if (is_leap_year(y) && m == 2) {
		d += 1;
	}
	return d;
}
int main() {
int y = 0;
	int m = 0;
	scanf("%d %d", &y, &m);
int d=	get_days_of_month(y,m);
printf("%d\n", d);
		return 0;
	}

在这里插入图片描述

链式访问:将一个函数的返回值作为另外一个函数的参数,像链条一样将函数串起来就是函数的链式访问。

在这里插入图片描述

可以写成 :printf("%zd", strlen("abc"));

例题:

printf(“%d”,printf(“”%d),printf(“%d”,43^(打印字符: 2个字符)^));
8. 函数的声明和定义

定义也是一种特殊的声明。

8.1 **函数的调用**:先声明,后使用。(定义在后面就要先声明)
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
//函数的声明
int is_leap_year();
int main() {
	int n = 0;
	scanf("%d", &n);
	//判断是否是闰年
	if (is_leap_year(n)) {
		printf("%d是闰年",n);
	}
	else {
		printf("%d不是闰年",n);
	}
	return 0;
}
//函数的定义
int is_leap_year(int n) {
	if ((n % 4 == 0 && n % 100 != 0) || (n % 400 == 0)) {
		return 1;
	}
	else {
		return 0;
	}
}

在这里插入图片描述

 在公司中的时候不会将代码只放到一个文件中,会往往根据程序的功能,将代码拆分到多个文件中。

 一般情况下,函数的声明,类型的声明放在头文件(.h)中,函数的实现是放在(.c)源文件中。

 库函数的头文件包含用尖括号,自己创建的头文件用双引号。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

8.2 static和extern

static和extern都是c语言中的关键字。

static是静态的,可以修饰局部变量,可以修饰全局变量,可以修饰函数。

extern是用来声明外部符号的。

在这里插入图片描述

     什么是作用域和生命周期呢?

局部变量(大括号内部) 的作用域就是局部变量所在的局部范围。

生命周期是进入作用域生命周期开始,出作用域生命周期结束。

全局变量(大括号外部) 的作用域是整个工程。

整个程序的生命周期。

8.2.1 static修饰局部变量

被static修饰后局部变量从栈区到静态区了。

一个变量出了函数后,我们还想保留值,等下次进入函数继续使用,我们用static修饰。

由外部连接属性变为内部链接属性。使得自己只能在自己所在的.c文件里使用。

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值