编程语言中的函数 可以说就是
一堆代码语句块的调用入口 这样可以达到
重复代码语句块的复用性 简洁明了
现在就来说说
函数语法规则
返回值类型 函数名 ( 函数参数区域 )
{
函数代码块
}
函数参数区域 也就是形参区
函数参数 可以写很多个
如
三参数函数且返回值为 int型
int fn( int b,char& c,void* d )
{
return 0;
}
无参数函数且返回值为 void 型
void fnvoid()
{
}
void fnvoid(void)
{
return;
}
存在形参有默认参数的函数且返回值为 int&型
int& fn1( char c,int* d,int b = 9 )
{
return *d;
}
const 修饰的返回值函数
const int fn2( int b,char& c,void* d )
{
return 0;
}
存在形参有默认参数的函数且返回值为 int&&型
右值引用 int 型 int&&
int&& fn1( char c,int* d,int b = 9 )
{
int e = 900;
return e;
}
右值引用作返回值 通常是告知别人 这返回的变量值是一个局部变量 防止非法访问
好了 大概声明方法说了一下了
调用规则
其实也很简单 就是要用函数的语句的地方
函数名(传入参数);
就是如此 简单
唯一要注意的 就是
传入参数需要 与被 调用函数所需参数个数 相同
(没有默认参数的情况下,有默认值的参数可以不传值)
函数的接参顺序与定义函数时的参数顺序一致
如
int main函数是程序执行的入口
int fn( int b,char& c,void* d )
{
return 0;
}
void fnvoid1();//函数前置声明
void fnvoid2(void);//函数前置声明
int fn1( int b = 9 );
int fn3( int b[100]);
int main()
{
int ma = 1;
char mc = ‘m’;
void * md = &mc;
fn(ma,mc,md);
// 函数参数初始化 等价于
// int b = ma,char& c = mc,void* d = md;
//如此以后 程序的执行流 就会跳转去函数语句块
//执行完后执行流便会返回到调用处 准备执行
//下一语句
int v = fn(ma,mc,md);
//如此 v 就是函数里 return语句 返回的值
//上述 v = 0;
调用无参函数 有个一小点特殊情况
fnvoid1();
fnvoid2();
这是我们熟知的方式 但是怪就怪在
fnvoid1(ma,mc,md);//这个函数可以写多个参
//进行调用 尽管这样传不了参数
//区别就在于 定义 fnvoid1函数时 ()里没写参数
//而定义fnvoid2函数时 ()里 写了个 void
fn1();// int b = 9;
fn1(ma);// int b = ma;
//上述就是含有默认参数的调用方法
//因为那个函数参数有默认值 所以调用时
//可以给可以不给
//定义存在函数默认参数需要注意
//默认参数只能放在参数列表的末尾
//如 int n(int a,int b = 0){ return 0;} ok
// int m(int a = 9,int b){ return 0;} error
//int k(int a = 9,int b = 0){ return 0;} ok
int ml[1000] = {9};
int size = fn3(ml);//size = 4; 与系统平台有关
//为何如此 函数传参时 当传入数组时 会出现退化现象
此处 一维数组 ml 被退化 成了 一级指针
int * 型
而在定义函数时
int fn3( int b[100]) 与 int fn3( int* b) 是一样的
但是
int fn3( int b[100][10]) 与
int fn3( int* b[10]) 方式是一致的
这就出现了 函数参数一维数组以上 数组会退化 掉第一维为指针 第二维 便不会退化 三维也不会 依次类推
调用时
假如 定义了一个int fn4( int b[100][10])的函数
int b[1000][10] = {6};
int c[1000][2] = {6};
fn4(b);//ok
fn4(c);//error 类型不匹配
//你传入的是 int*[2]类型
//函数需要的是 int*[10] 类型 数组其实是有类型的
return 0;
}
void fnvoid1()
{
}
void fnvoid2(void)
{
return;
}
int fn1( int b /* 9 */ )
{
int e = 900;
return e;//return(e);
}
int fn3( int b[100])
{
return sizeof b;
//sizeof 计算出 变量所占有的内存字节大小
//如
/*
int c[10];//数组 内部有 10个int 型元素
如名为a的一栋楼一共有 10 层 每层 皆是int型
访问方式 a[0] a[1] a[层数] 第一层 是 0 后续 依序
int c2 = 10;
sizeof c2;// 4
sizeof c;// 4*10 = 40
*/
}
我们一直看到了 return 这个关键字
return (返回)
很明确的意思 当程序流遇到它时 直接结束函数
返回到调用处 而函数的返回值 也是它一起拿出去的
void 无返回值的函数 也是可以使用 return 只是无需在后面带上返回值