函数
在c语言中,函数就是子程序,是一个大型程序中的部分代码,负责完成某项特定的任务,具备相对的独立性,一般会有输入和返回值。
库函数
实现基础功能、频繁使用的代码被封装为库函数,支持可移植性和提高了程序的效率。常见的打印函数printf、getchar就是库函数的一种。
IO输入输出函数:printf、scanf、getchar、putchar
字符串操作函数:strcmp、strlen
字符操作函数:toupper
内存操作函数:memcpy 、memcmp 、menset
时间/日期函数:time
数学函数:sqrt、pow
其他函数
举例:
strcpy函数(拷贝函数) char*strcpy(char*destination,const char*source)将source地址指向的内容拷贝到destination地址的地方去 对应的头文件为string.h 函数开头声明包括头文件#include <string.h> 使用库函数必须先声明头文件
menset(内存设置函数) void*menset(void*ptr,int value,size_t num) 把ptr指针指向的内容的前num个字节全部设置成value的值
自定义函数
函数不定义返回类型,默认返回类型为int
举例:比较两个数的最大值
int get_max(int x, int y)
{
int max = 0;
if (x > y)
max = x;
else
max = y;
return max;
}
int main()
{
int a = 10;
int b = 20;
int max = get_max(a, b);
printf("%d", max);
return 0;
}
实参和形参
实参:真实传给函数的参数,可以是变量、常量、表达式、函数等。无论是何种类型,在进行函数调用时,都必须有确定的值,以便把这些值传送给形参。
形参:函数名后括号中的变量,形参只有在函数被调用的过程中才实例化(分配内存单元),当函数调用完成之后就自动销毁了,形参只在函数中有效。
函数的调用
传值调用
函数的形参和实参分别占有不同的内存块,对形参的修改不会影响实参。
传址调用
传址调用是被函数外部创建变量的地址传递给函数参数的一种调用方式。可以让函数和函数外部的变量建立起真正的联系,函数内部可以直接操作函数外部的变量。
函数的嵌套调用和链式访问
函数可以嵌套调用,但是不能嵌套定义。链式访问就是把一个函数的返回值做另一个函数的输入值。
函数的声明和定义
函数声明
函数的声明一般出现在函数的使用之前,要先声明后使用,函数的声明一般放在头文件中。
函数定义
函数的定义是指函数的具体实现,交待函数的功能实现。子函数最好都放在主函数之前。
函数的递归
程序调用自身的编程技巧称为递归。一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的主要思考方式在于:把大事化小。
递归的两个必要条件:1、存在限制条件,当满足这个限制条件后,结束递归。2、每次递归调用之后越来越接近这个限制条件。
举例:接受一个无符号整型,按照顺序打印它的每一位
void print_num(unsigned int n)
{
if (n > 9)
{
print_num(n / 10);
}
printf("%d", n % 10);
}
int main()
{
unsigned int num = 0;
printf("请输入一个数:");
scanf("%u", &num);
//函数递归就是自己调用自己
print_num(num);
return 0;
}
一维数组
数组时一组相同类型元素的集合。
type_t arr_name [cost_n]
//type_t是指数组的元素类型,cost_n时一个常量表达式,指定数组的大小
数组创建时。[ ]中必须是一个常量,不能使用变量。
数组初始化是指在创建数组同时给数组的内容一些初始值。
数组通过使用下标来访问,下标从0开始。数组的大小可以通过计算得到。
int sz=sizeof(arr)/size(arr[0])
一维数组在内存中是连续存放的。随着数组下标的增长,地址是由低到高变化的。
二维数组
//二维数组
int arr[3][4] = { 1,2,3,4,5,6,7,8,9,10 ,11,12};//从左往右,从上往下,依次放入数组元素
int arr[3][4] = { 1,2,3,4,5,6,7 };//不完全初始化,缺的元素补0
int arr[3][4] = { {1,2},{3,4},{4,5} };//按行放入元素,缺的元素补0
//初始化中行可以省略,列不可以省略
二维数组的行号和列号都是从0开始的,依旧可以通过下标索引。 二维数组在内存中也是连续存在的,换行了也是连续的。
冒泡排序思想:两两相邻的元素进行比较,并且需要交换。代码举例:
void bubble_sort(int arr[],int sz)
{
int i = 0;
for (i = 0; i < sz - 1; i++)
{
int j = 0;
for (j = 0; j <sz-1-i ; j++)
{
if (arr[j] > arr[j + 1])
{
int tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
}
}
}
}
int main()
{
int arr[] = { 23,45,756,87,3,5,7,234,67,987 };
int sz = sizeof(arr) / sizeof(arr[0]);
bubble_sort(arr,sz);//数组传参时,传的是首元素的地址
int i = 0;
printf("排序结果为:");
for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
数组传参时,传的是首元素的地址,数组名是数首元素的地址。(注:1、sizeof(数组名),数组名表示整个数组,计算的是整一个数组的大小,单位是字节。2、&数组名,数组名表示整个数组,取出的是整个数组的地址)