淘宝上做网站怎么样,新乡哪有网站建设公司,cpu优化软件,做网站准备什么问题目录
函数是什么 C语言中函数的分类 库函数
自定义函数
函数的参数
实际参数#xff08;实参#xff09;
形式参数#xff08;形参#xff09;
函数的调用
传值调用
传址调用
练习
函数的嵌套调用和链式访问
嵌套调用
链式访问 函数是什么
数学中我们常见到函…目录
函数是什么 C语言中函数的分类 库函数
自定义函数
函数的参数
实际参数实参
形式参数形参
函数的调用
传值调用
传址调用
练习
函数的嵌套调用和链式访问
嵌套调用
链式访问 函数是什么
数学中我们常见到函数的概念。但是你了解C语言中的函数吗 维基百科中对函数的定义子程序 在计算机科学中子程序英语Subroutine, procedure, function, routine, method, subprogram, callable unit是一个大型程序中的某部分代码 由一个或多个语句块组 成。它负责完成某项特定任务而且相较于其他代码具备相对的独立性。一般会有输入参数并有返回值提供对过程的封装和细节的隐藏。这些代码通常被集成为软件库。 C语言中函数的分类 1.库函数 2.自定义函数 库函数 这里有一个查看库函数的网站http://www.cplusplus.com 为什么会有库函数像printfstrcpypow这些都是库函数这些库函数完成了一些基础功能我们在开发的过程中每个程序员都可能用的到增强了程序的可移植性和提高程序的效率。 简单的总结C语言常用的库函数都有 IO函数 字符串操作函数 字符操作函数 内存操作函数 时间/日期函数 数学函数 其他库函数 补充大家可能会这样想库函数是不是C语言提供的呢其实不然C语言标准只是规定了函数的功能、函数名、函数的参数以及返回类型但是函数的具体实现是由编译器厂商提供的也就是说不同的编译器厂商对一同一个函数的实现代码可能有所不同比如微软和苹果这两家厂商提供的编译器在实现strlen时函数的功能完全一样但是函数内部实现代码会有所不同因为这是不同的程序员写的
接下来我们查阅文档来学习一下memset函数。 从上图中我们大概了解到memset的函数功能大概是将ptr指向的前num的字节替换成value需要包含string.h头文件
我们简单使用一下这个函数 就会发现这个函数原来是这个样子呀~ 注库函数必须知道的一个秘密就是使用库函数必须包含 #include 对应的头文件。 自定义函数 如果库函数能干所有的事情那还要程序员干什么 所有更加重要的是自定义函数。 自定义函数和库函数一样有函数名返回值类型和函数参数。 但是不一样的是这些都是我们自己来设计。这给程序员一个很大的发挥空间。 函数的组成 ret_type fun_name(para1, *) { statement;//语句项 } ret_type 返回类型 fun_name 函数名 para1 函数参数 下面我们看一个例子 写一个函数可以找出两个整数中的最大值。 #include stdio.h
int get_max(int x, int y)
{return x y ? x : y;
}
int main()
{int num1 10;int num2 20;int max get_max(num1, num2);printf(%d\n,max);return 0;
}
函数的参数
实际参数实参 真实传给函数的参数叫实参。实参可以是常量、变量、表达式、函数等。无论实参是何种类型的量在进行函数调用时它们都必须有确定的值以便把这些值传送给形参。 形式参数形参 形式参数是指函数名后括号中的变量因为形式参数只有在函数被调用的过程中才实例化分配内存单元所以叫形式参数。形式参数当函数调用完成之后就自动销毁了。因此形式参数只在函数中有效。 可以简单的认为形参实例化之后其实相当于实参的一份临时拷贝。
函数的调用
传值调用 函数的形参和实参分别占有不同内存块对形参的修改不会影响实参。 传址调用 传址调用是把函数外部创建变量的内存地址传递给函数参数的一种调用函数的方式。 这种传参方式可以让函数和函数外边的变量建立起真正的联系也就是函数内部可以直接操作函数外部的变量。 练习
1. 写一个函数可以判断一个数是不是素数
#include stdbool.h
#include stdio.h
#include math.h
bool is_prime(int n)
{int j 0;for (j 2; j sqrt(n); j){if (n % j 0){return false;}}return true;
}
int main()
{int i 0;int count 0;for (i 101; i 200; i 2){if (is_prime(i)){printf(%d , i);;count;}}printf(\ncount%d\n, count);return 0;
}
2.写一个函数判断一年是不是闰年。
#include stdbool.h
bool is_leap_year(int y)
{if (((y % 4 0) (y % 100 ! 0)) || (y % 400 0)){return 1;}elsereturn 0;
}
int main()
{int y 0;int count 0;for (y 1000; y 2000; y){if (is_leap_year(y)){printf(%d ,y);count;}}printf(\n%d\n, count);return 0;
}
3.写一个函数实现一个整形有序数组的二分查找。
//找到了就返回下标
//没找到返回-1
int binary_search(int arr[], int k, int sz)
{int left 0;int right sz - 1;while (leftright){//这种求平均的方法可能会溢出//int mid (left right) / 2;//这种方法求中间值比较好int mid left (right - left) / 2;if (arr[mid] k){left mid 1;}else if (arr[mid] k){right mid - 1;}else{return mid;}}return -1;
}
int main()
{int arr[10] { 1,2,3,4,5,6,7,8,9,10 };int k 0;scanf(%d,k);int sz sizeof(arr) / sizeof(arr[0]);int n binary_search(arr, k, sz);if (n -1){printf(没找到\n);}else{printf(%d\n,n);}return 0;
}
函数的嵌套调用和链式访问
函数和函数之间可以根据实际的需求进行组合的也就是互相调用的。
嵌套调用
#include stdio.h
void new_line()
{printf(hehe\n);
}
void three_line()
{int i 0;for (i 0; i 3; i){new_line();}
}
int main()
{three_line();return 0;
}
函数可以嵌套调用但是不能嵌套定义。
链式访问
#include stdio.h
#include string.h
int main()
{char arr1[20] {0};//abc\0.....char arr2[] abc;printf(%d\n, strlen(strcpy(arr1, arr2)));//链式访问return 0;
}
看一组有意思的代码
#include stdio.h
int main()
{printf(%d, printf(%d, printf(%d, 43)));//注printf函数的返回值是打印在屏幕上字符的个数return 0;
} 4321