函数
三要素:功能、参数、返回值
概念:函数是独立的功能代码模块。22
格式:
[存储类型] 数据类型 函数名(形参列表)
{
功能代码块;
return 常量/变量/表达式;
}
常量/变量/表达式的类型需要和函数的数据类型保持一致。
当函数不需要返回值,函数类型为void类型,return语句可以没有。
当定义的函数不需要传参,形参列表写成void,若不写void,
调用函数时,传递实参不会报错,但是传递的值会占用资源,
浪费资源同时可能会导致代码出现问题找不出错误原因。
函数的声明:[存储类型] 数据类型 函数名(形参列表);
函数的调用:函数名(实参);
1)不需要接收返回值和不需要传参:函数名();
2)需要接收返回值和不需要传参:
调用函数时定义一个返回值类型的变量接收返回的值。
变量=函数名();
3)不需要接收返回值和需要传参:
函数名(实参);
4)需要接收返回值和需要传参:
调用函数时定义一个返回值类型的变量接收返回的值。
变量=函数名(实参);
调用:函数名(实参);
形参和实参的区别:
1)形参是定义函数时,会定义形参变量。形参是形式上存在的参数,
只有在调用函数时才开辟内存空间。没有调用不开辟内存空间。
2)实参是调用函数实现函数功能时,实际传递的值。实参是实际存在的
值
函数的传参:
1)值传递:
将值复制一份传递过去,对复制的内容修改,原内容不变。
2)地址传递:
将变量的地址传递过去,通过地址可以对原内容进行修改。
3)数组传递:
本质也是地址传递,传递的是数组的首地址(一维数组)。
字符串操作函数
#include
string函数族
1.strlen 计算字符串长度
szie_t strlen(const char *s);
功能:计算除’\0’字符串中字符的个数。遇到’\0’结束。
参数:s:字符串首地址
返回值值:成功返回字符串长度
面试题:strlen和sizeof的区别
1.sizeof关键字,计算数组所占空间大下,包含’\0’.
2.strlen是函数,结算字符串长度,不包含’\0’.
2.strcpy 复制
char strcpy(char dest, const char *src);
功能:实现字符串的复制
参数:dest:复制的字符串的存放位置
src:要复制的字符串
返回值:复制后字符串的首地址
3.strcat 字符串拼接
char strcat(char dest, const char *src);
功能:实现字符串的拼接,将dest后的\0去掉后再拼接
参数:dest:拼接的字符串的存放位置
src:要拼接的字符串
返回值:拼接后字符串的首地址
4.strcmp 字符串比较
strncmp
int strcmp(const char s1, const char s2);
功能 :比较两个字符串的大小,按字符比较,
比较字符ASCII码
参数:两个字符串的首地址
返回值:s1 > s2 返回正数
s1 < s2 返回负数
s1 = s2 返回0
注意:int strncmp(const char s1, const char s2, size_t n);
表示对两个字符串前n个字符从左向右逐个字符按ASCII码,进行比较
指针函数:
本质:函数,函数的返回值为地址
格式:
数据类型 函数名(形参)
{
return 地址;//return NULL;
}
**void malloc(size_t size);//12byte p第一个字节的地址
功能:手动申请空间,申请的空间在堆区
参数:申请的空间大小
返回值:**任意类型指针(申请空间的首地址)
void free(void *ptr);
功能:释放空间
参数:要释放的空间
返回值:无
指针函数返回局部变量地址空间被释放问题解决方法:
1)用static延长局部变量的生命周期。
2)用malloc在堆区手 动开辟内存空间,用完后手动释放。
3)直接定义为全局的变量。
4) 针对字符串:返回一个字符串常量的首地址。
char *sp=”hello”;//字符串常量,只要拿到它首地址,就可以使用。
return sp;
函数指针:
**本质:**指针,指向函数的指针 <br /> **格式:**数据类型 (*函数指针变量名)(形参);<br /> <br /> int add(int a,int b)<br /> {<br /> return a+b;<br /> }<br /> int sub(int b,int c)<br /> {<br /> return b-c;<br /> }<br /> int sul(int a,int b)<br /> {<br /> return a*b;<br /> }<br /> <br /> int (*fun_p)(int ,int)=add ; <br /> fun_p=sub;<br /> <br /> //int a=10,b=20;int *p=&a; p=&b<br /> <br /> **通过函数指针调用函数:**<br /> **fun_p(实参);**<br /> **(*fun_p)(实参);**//不常见<br /> <br /> **char *fun(int a,char *q)**==>定义一个函数指针指向这个函数<br /> **char *(*sp)(int ,char *);**==>sp是函数指针指向fun函数<br /> **sp=fun;**<br /> <br /> 一般用于在函数中回调其他函数。<br />
函数指针数组:
**本质:**数组,元素是指向函数的指针 <br /> **格式:**数据类型 (*函数指针数组名[下标])(形参); <br /> <br /> int add(int a,int b)<br /> {<br /> return a+b;<br /> }<br /> int sub(int b,int c)<br /> {<br /> return b-c;<br /> }<br /> int sul(int a,int b)<br /> {<br /> return a*b;<br /> }<br /> <br /> int (*p[3])(int,int)={add,sub,sul};<br /> p[0]-->add<br /> p[1]-->sub<br /> <br /> **p[0](实参)**==》add(实参);<br />
递归函数
概念:函数中直接或间接调用本身的函数。
递归函数调用的执行过程分为两个阶段:
1)递推阶段:从原问题出发,按递归公式递推从
未知到已知,最终达到递归终止条件。
2)递归阶段:按递归终止条件求出结果,
逆向逐步代入递归公式,回归到原问题求解。
6! 6*5*4*3*2*1
int digui(int n)
{
if(n==1)
return 1;
return ndigui(n-1);
}
//递推: 递归:
digui(6);=720
=》6 digui(5)=120
=>6 5 digui(4)=24
=>6 5 4 digui(3)=6
=>6 5 4 3 digui(2)=2
=>6 5 4 3 2 digui(1)=1