今天我学习了C语言函数部分,包括库函数、头文件、参数、变量等内容,下面我把我今天所写的代码与知识点分享给大家。
1.函数的应用包含函数定义和函数调用两部分
// 函数的定义
int Add(x, y) //x和y是形式参数,为了存放函数调用时传入的实际参数
{
return x + y;
}
// 函数的调用
int main()
{
int a = 0;
int b = 0;
int c = 0;
scanf("%d %d", &a,&b);
c = Add(a,b); //调用Add函数,a和b是实际参数
printf("ab之和=%d\n", c);
return 0;
}
2.参数的传递
函数参数的传递是值传递,数组名作为参数时传递的是数组首地址
// 一维数组作为参数
void set_arr1(int arr1[10], int sz)
{
int i = 0;
for (i = 0; i < sz; i++)
{
arr1[i] = -1;
}
}
// 二维数组作为参数
void Print_arr(int arr[3][5], int x, int y)
{
int i = 0;
int j = 0;
for (i = 0; i < x; i++)
{
for (j = 0; j < y; j++)
{
printf("%d ", arr[i][j]);
}
printf("\n");
}
}
3.函数的返回值
函数返回值类型与函数声明类型不一致时会自动转换
int test()
{
int a = 5;
if (a == 5)
{
return 3.5; //返回值类型是int,实际返回的是3.5,编译器会自动转换为3
}
else
return 6;
}
4.用return提前返回
void game()
{
int a = 0;
scanf("%d", &a);
printf("hehe\n");
if (a == 5) //如果a等于5,则执行return语句,提前返回,结束函数game的执行
{
return;
}
printf("haha");
}
5.函数的链式访问
函数返回值可以作为另一个函数的参数
int main() //链式访问printf函数的返回值
{
printf("%d", printf("%d", printf("%d", 43)));
//printf函数返回值是打印的字符个数
//第一次打印43,返回值是2
//第二次打印2,返回值是1
//第三次打印1,返回值是1
//结果是4321
}
6.变量的作用域和生命区间
局部变量(存在栈区)和静态变量(存在静态区)的作用域和生命周期不同
// 局部变量
int test()
{
int j = 0; //函数体内的变量j是局部变量,作用域仅限于函数test
j++; //j存在栈区
printf("%d\n", j);//生命周期是函数调用时创建,函数调用结束后销毁
}
// 静态变量
test()
{
static int j = 0; //static变量的作用域是函数体内,但生命周期是整个程序运行期间
j++; //static把变量存在了静态储存区
printf("%d\n", j);
}
7.函数的模块化
为了效率,函数声明可以放在.h头文件中,函数定义放在.c源文件中
想使用函数直接#include“***.h"
8. 外部变量
使用extern声明外部变量,static修饰的变量不能被其他文件访问。
extern int a; //声明一个外部变量a,告诉编译器这个变量在其他文件中定义
// 但是当外部变量在所在文件被static修饰时,extern声明无效
// 因为static修饰的变量只能在当前文件中使用,不能被其他文件访问
// 函数默认具有外部链接属性,除非使用static修饰函数
9.判断闰年
// 根据年月判断天数
int is_leap_year(int year)//判断是否是闰年
{
if (((year%4==0)&& (year%100 != 0))||(year%400==0) )
{
return 1; //是闰年
}
else
{
return 0; //不是闰年
}
}
int get_days(int year, int month)//根据年月获取天数
{
int days[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
int d = days[month];
if (is_leap_year(year) && month == 2)
{
d = 29;
}
return d;
}