目录
一、函数
定义:函数的具体实现,交代函数的功能实现
声明:一般放在头文件中,告诉函数叫什么,有什么参数
组成:返回类型、函数名、函数参数
当实参传递给形参的时候,形参是实参的一份临时拷贝
C语言中函数的分类:
1.库函数
2.自定义函数
常见函数:
1.strcpy( , ) 复制字符串,头文件:string.h
eg:strcpy(arr1,arr2) 将arr2中的字符串复制到arr1中
2.memset() 内存设置,头文件:string.h
eg:char arr[0]={"Hello World"}
memset(arr,'x',5);
从第一个数开始把第5个数改为x
memset(arr+6,'y',3);
从第6个数开始把3个数改为y
3.sqrt() 开平方,头文件:math.h
4.boll类型:用来表示真假
return true;(真) return false;(假)
参数
分类:
1.实际参数(实参)
实参可以是:常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传个形参
2.形式参数(形参)
形式参数是指函数名后括号中的变量,因为形式参数只有在函数被调用的过程中才实例化(分配内存单元)
形式参数当函数调用完后就自动销毁了,形参只在函数中有效
调用:
1.传值调用:函数的形参和实参分别占有不同的内存块,对形参的修改不影响实参
2.传址调用:
1°传址调用是把函数外部创建变量的内存地址传给函数参数的一种调用函数的方式
2°这种方式可以让函数和函数外边的变量建立真正的联系,也就是函数内部可以直接操作函数外部的变量
函数的递归:把大事化小;前->后->前
必要条件:
1.存在限制条件,当满足这个限制时,递归便不再继续
2.每次递归调用之后越来越接近这个限制条件
%d:打印有符号整形(有正负数)
%u:打印无符号整形(没负数)
注:数组传参实际上是传递的首元素地址,而不是整个数
二、函数栈帧
寄存器:eax、ebx、ecx、edx、ebp(栈底指针)、esp(栈顶指针)、
栈帧:ebp、esp这两个寄存器中存放的地址,是用来维护栈帧的,每一个函数调用,都要在栈区创建一个空间
栈:高地址->低地址
压栈:栈顶放
出栈:栈顶删
解决栈溢出:
1.将递归->非递归
2.使用static对象代替nonstatic局部对象