有时候,如果程序的功能比较多。规模比较大,把所有的程序代码都写在一个主函数中,就会使得主函数太庞杂,所以为了方便阅读和维护程序,就引入了重构 程序 的概念,把某些功能都在其他分支完成,然后需要哪个功能的时候就完成该分支到主函数,这些分支就叫它函数,完成就调用,这样就会使主程序简化了,哪个函数 是做什么也非常清楚。哪里用得到这个功能就在哪个调用就可以了!
C 语言的函数可以洞察出面向过程和面向对象的区别,C 语言的函数有 一个特点,就是它有固定的格式和固定的模型。对于一个C 程序而言,它所有的命令都包含在函数内部。每个函数都会执行特定的任务。每个函数都只能被定义一次。但一个函数可以根据需要被多次的声明和调用。函数的定义
在使用函数之前必须
定义函数要包括:
1、指定函数的数据类型,以便后续返回值的调用
2、指定函数 的名字,以便后续调用
3、指定函数 形参的类型和名称,便于后续传递数据,对于无参(void)可以不用
函数类型+函数名+(参数表){
函数体
}
参数值的()等于了表 说明函数调用的重要作用即使没有参数也需要(),如果有参数,则需要给出正确的数量和顺序,这些值会按照一般一定的顺序(看编译环境是从右到左)依次来初始化函数 中的参数
注意 如果调用函数时给定的值与参数的类型不匹配,有些编译环境可能会帮助类型强制转换好,但是有可能不是你想要的那样。所以建议传递给函数的值要与语句一致
#include
int a(int a);//但是如果换成浮点类型输出将会不一样 p>
int main(void){
双 t = 23.8;
a(t);//这里传进去的是浮点数(实参)
}
int a(int a){ //这里接收到的是整型的实参
int t = a;
//所以即使换成double t也一样
printf( “%d”, t);//输出23
}
//但是更高级的语言会像java一样严格检查 C++
函数的传值
每个函数都有自己的变量空间,参数也位于这个独立的空间中,而其他函数没有关系
传递值:传递给函数的值可以是表达式的结果(包括):字面量、变量、函数的返回值、计算的结果。但是在调用函数时,永远只能传递值 给函数,在传值的时候实际上只是把实参的值传递到形参处,做的只是一个复制的过程(但是铲子不一样了)
在函数定义的形参处 其中,它们不占用内存的,在主函数内调用形参的 把实参的值传递给形参,在调用结束后,形参的存储单元被释放,而 形参值的任何变化都不会影响到实参的值,实参的存储 单元仍保留并维持数值不变。
地址的传递:形参为指针变量时函数之间的数据传递,如果函数的形参为指针类型时,对应的实参类型必须与 形参保持一致
这种方式使 使用读写名或者指针作为函数参数,传递的是该数据库的首地址或指针的值,而形参接收到的是地址,即指向实参的存储单元,形参和实参占用相同的存储单元, 这种交付方式称为“参数的地址交付”。
地址传送的特点是形参并不会占用存储空间,数据库名或卸载器就是一组连续空间的首地址。因此在数据库名或卸载器作函数参数时所进行的传送只是地址 传送,形参在获得该首地址之后,与实参共同存在一个存储单元,形参的变化和实参的变化。< /p>
函数的返回值
在定义的时候,如果不需要返回值的时候定义void类型,其他时候定义其他数据类型。但是使用void类型的时候,不能使用带 值的return(可以没有return),调用的时候不能做返回值的赋值int 和void的不同:
前面加有void 的函数,不能返回任何数据,此类函数应该将所有实现的功能在本函数内全部实现。但是不能与外部交换数据,仍然可以通过引用类型参数传递数据,只是调用时不能直接接受返回 值,因为就没有返回值。
前面有i nt的函数,返回值是整型数,结果可能是整数,也可能是运行状态,成功或失败的标识,函数调用时可以直接利用返回信息,实现一些功能。
main()函数的揭秘
main()函数原形:int main(int argc,char const*argv [ ] )
里边的两个参数,允许从执行环境中传递任意的多字节字符串(argv[0])本身就是命令,命令行 参数是保存在argv[]里的,C/C++语言规定的,执行程序程序本身的文件名和地址 ,其中一个描述的是命令行参数的个数,通常称为argc;另一个是命令行参数的队列,通常称为argv。命令行参数都是字符串,所以argv的类型是char * [argc+ 1]。该程序的名字也作为argv[0]传进来,这个参数的表总以0结束,如图,argv[argc]==0。(argv仓库的最后一个元素存放了一个NULL的拖鞋 )
#include
int main(int argc, char * argv[]){
//argv[0]== 调用函数时使用的程序名和地址
//argv[1]==参数1
//argv[2]==参数2
/ /argv[3]==参数3
//依次类推...
//argc就是计算并保存总共有多少个参数的
int i;
for (i = 0; 我 printf("%s\n", argv[i]); } 返回 0; } 给main函数传递这两个参数,argc和argv。argc是int类型的,它表示的是命令行参数的个数。不许 要传递给用户,它会根据用户从命令行输入的参数个数,自动确定。argv是char**类型的,它的作用 是存储用户从命令行(黑窗口输入)输入进来的参数。它的第一个成员是用户运行的程序名称。 main函数的返回值,用于说明程序的退出状态。 如果返回0,则代表程序正常退出;返回其他数字的含义则由系统决定,通常,返回非零代表程序异常退出。 (一般是由return返回) return的妙用 (return是C语言的关键字)函数定义为什么样的返回类型,该函数中return后就应该是相应的 类型的值。 在函数中,如果返回语句,那么程序就会返回调用该函数的下一条语句执行,一旦跳出函数的执行,回到原来的地方继续执行 下去。 但是如果是在主函数(main)中返回语句,那么整个程序就会停止。return表示从被调函数返回到主调函数或其他函数继续执行,返回时可附带一个返回值,返回值可以 传指针形式:直接传给函数是变量的地址,由于被调节函数在参数指针的作用域之内,此时直接改变变量的本体。 返回值: 计算结果表示函数执行的顺利与否(-1、0) 返回值可以为各种数据类型,如:int,float,double,char,a[堆],*a(指针),结构或类。写返回可以是一种清晰的风格,防止一些意外的错误。 有时也想中断函数执行,返回调用函数 处。 返回本地变量的地址是危险的,返回全局变量或静态本地变量的地址是安全的,返回函数malloc的内存是安全的,但是容易造成问题,最好的办法 返回是确定的指针。 在函数中调用函数自己 :即自己return自己 = 血压 #include int add(int n);int i; int main(void) { int n; scanf("%d", &n); int c; 对于 (i = 1; i <=n; i++) {//输出数据列 c = add(i);//调用函数 printf("%d ", c); } return 0; }int add(int n) {//梯度 if (n == 1) { //第一页是1 返回 1; } else if (n == 2) {//第二个耳机也是1 返回1; } else { return (add(n-1) + add(n - 2));//第三位开始等于它之前他们相加 1+1=2 所以第三位是2 } }本地变量和全局变量的补充 本地变量的规则: 本地 标记是在块内定义的:可以是在函数的块内定义,也可以是在语句的块内定义,甚至可以随便拉双人大音符来定 但是程序进入这个块之前,在这个块内定义的变量是不存在的,离开这个块,它也必然消失。 所以,在 块外侧定义的变量在变量仍然有效,但是在块里定义边的变量出去块外侧就无效了。 注意 :如果在块外边定义和里边同名的变量,里边的变量会覆盖外边的值(小覆盖大的)。 不能再同一个块内定义同名变量,本地变量不会被初始化 ,参数再进入函数的时候就被初始化了。 本地变量的规则: 没有做初始化的全局变量会得到 零值,指针会得到NULL,只能用编译时刻已知道的值来初始化全局变量,它们的初始化再主函数之前。 注意:不要在函数传递之间使用全局变量来 参数和结果。避免使用全局变量(丰田的案例),使用全局变量和静态的本地变量是线程不安全的。
作者:Mr_Li_
对啦对啦!其他的话为了帮助大家,轻松,高效学习C语言/C++,我给大家分享我收集的资源,从零开始 开始的教程到C语言项目案例,帮助大家在学习C语言的道路上披荆斩棘!可以来我粉丝群领取哦~
编程学习书籍分享:
编程学习视频 分享: p>
整理分享(多年学习的源码、项目实战视频、项目笔记,基础入门教程)最重要的是你可以在群交流里面提问Smashing问题哦!
对于C/C++ 感兴趣的可以关注小编在后台私信我:【编程交流】一起来学习哦!可以领取一些C/C++的项目学习视频资料哦!已经设置好了关键词自动回复,自动领取就可以了! p>