可分为库函数和自定义函数,库函数就是c语言对我们所提供可使用的函数。
常见的有
IO函数(输入输出函数)
字符串以及字符操作函数
内存操作函数
时间/日期函数
数学函数
其他库函数
#include
#include
int main()
{
char arr1[] = "abcdef"; //a b c d e f \0
char arr2[20] = "XXXXXXXXXXX";//X X X X X X X XXXX\000
//能把arr1中的abcdef拷贝到arr2中
strcpy(arr2, arr1);
//string copy
printf("%s\n", arr2);
return 0;
}
strcpy函数会把\0也赋值出来。
用于替换字符串内的字符。
void * memset ( void * ptr, int value, size_t num );
//sizeof的返回的值的类型是size_t
int main()
{
char arr[] = "hello bit";
memset(arr+6, 'X', 3);
//1. 设置内存的时候是以字节为单位的
//2. 每个字节的内容都是一样value
printf("%s\n", arr);//XXXXX bit
return 0;
}
值:将实参传递给形参,对形参的修改不会影响到实参。
址:把外部变量地址传递给函数参数来调用函数,让函数内部可以操作函数外部的变量。
函数可以嵌套调用但是不能嵌套定义。
int main()
{
//int len = strlen("abcdef");
//printf("len = %d\n", len);
//printf("len = %d\n", strlen("abcdef"));
printf("%d", printf("%d", printf("%d", 43)));
return 0;
}
把一个函数的返回值作为参数调入到另外一个函数中。
int Add(int x, int y)
{
return x + y;
}
int main()
{
int a = 10;
int b = 20;
int sum = Add(a, b);//函数的使用
printf("%d\n", sum);
return 0;
}
需要在使用函数前就申明函数,而不是如下。
int main()
{
int a = 10;
int b = 20;
int sum = Add(a, b);//函数的使用
printf("%d\n", sum);
return 0;
}
int Add(int x, int y)
{
return x + y;
}
这样编译器就会报错。
函数还可以放在同一个文件的不同分文件下面,比如在test.c中在开一个add.h和add.c的文件,在add.h中放置函数的声明(int Add(int x, int y);),在add.c中放置函数的定义(return x + y;),这两个合称为加法模块,在test.c中要使用Add函数时只需要引用头文件#include "add.h"就可以了。
在函数文件中右键函数文件,点开属性,配置属性,常规,配置类型,下拉选择静态库(.lib)。然后生成,生成解决方案。
#pragma comment(lib, "add.lib")
可以用以上代码导入静态库,导入前也需要引头文件。
函数调用自身就叫做递归,使用条件:
存在限制条件,满足这个限制条件递归就不会继续。
每次递归调用后越来越接近这个限制条件。
void print(int n)
{
if (n > 9)
{
print(n/10);
}
printf("%d ", n % 10);
}
//函数print会在(n>9)时不断调用自己,最终输出每个数字的位数。
再比如求一个字符串长度:
int my_strlen(char* str)
{
if (*str != '\0')
return 1 + my_strlen(str+1);
else
return 0;
}
//这样str最终会指向\0,return 1最终会计算出字符串长度。