c++之说_8|函数

编程语言中的函数  可以说就是 

一堆代码语句块的调用入口  这样可以达到

重复代码语句块的复用性  简洁明了

现在就来说说

函数语法规则

返回值类型   函数名 ( 函数参数区域 )

{

函数代码块

}

函数参数区域  也就是形参区

函数参数  可以写很多个 

三参数函数且返回值为 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  只是无需在后面带上返回值

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值