1、提高代码的复用
相同的功能可以封装成一个函数,用到该功能时直接调用函数;
2、提高代码的扩展性
增删功能,不用在整体代码上删改,这样容易出错,把功能封装成函数后,只要修改相应功能模块就行了
3、增强代码的维护性
出现问题可以直接找到实现该功能的代码,方便修改和判断位置
补:
面向过程:把问题分解成一个个步骤(功能),按照一定顺序实现一个个步骤(功能),实现模块化程序设计的思路。
面向对象:面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。当解决一个问题的时候,面向对象会把事物抽象成对象的概念,就是说这个问题里面有哪些对象,然后给对象赋一些属性和方法,然后让每个对象去执行自己的方法,问题得到解决。
二、函数的相关语法 1、函数的三要素 函数名 函数形参 函数返回值int main (int argc,char ** argv)
int 表示函数的返回值类型是整形
main 主函数名,程序运行第一个执行的函数
(int argc,char ** argv) 函数形参,命令行参数,Linux终端运行程序时用来给主程序传入参数 ,./run也算一个命令行参数,argc 表示命令行参数个数,char ** argv也可以写成char * argv[ ],数组指针,指针指向数组的每一个元素
return 0;在Linux中给系统返回程序运行状态,最好加上,可以及时回收系统资源,其他情况return可以返回不同类型(根据定义类型)的函数返回值
命令行参数例:
#include#include int main(int argc,char ** argv) { if(argc!= 3) { printf("please input three name"); exit(1); } printf("%s %sn",argv[1],argv[2]); return 0; }
2、函数的使用形式 函数声明 函数定义 函数返回值(越学越感觉重要) 1、函数调用包含元素:函数名 实参的变量名或地址(重点传值还是传地址) 2、函数声明包含元素:函数名 返回值 形参的类型,可以不提供变量名(函数声明不是定义,不分配内存)
注意:
a、声明不分配内存,函数声明是为了提前告诉编译器这是一个函数,调用时不出错,所以在调用函数位置后定义的函数要在调用前加上函数声明
b、实参传递时要根据调用函数的类型,什么类型传什么函数实参,或者说形参定义什么类型接实参要根据实参的类型。
指针传参 实参是一维指针地址用二维指针接,传递一维指针名用一维指针
3、 函数调用过程a、通过函数名找到函数入口地址
函数地址=函数入口地址=&函数名(函数指针(*a)(void *),指针保存函数的地址,其实就是函数名被指针代替)
b、给形参分配空间(传参时)
c、传参 将实参复制一份(注意区分是地址还是值)传递给形参的空间储存
d、执行函数体的语句
e、函数返回,释放函数分配的空间(函数分配的空间是局部变量)
4、传值 (传的是实参变量名)VS 传地址(传实参变量的地址)
传值,相当于把实参值复制一份给形参变量,与当前变量的没有关系,就是说形参发生改变,实参变量不变
传地址相当于把地址传复制一份给形参变量,我改变传递的地址同样不关实参的事,但是我可已通过地址找到地址中的内容,改变内容,实参内容肯定就会变了
例:传值,相当于你(形参)根据我(实参)的房子盖了一样的房子,你在你家怎么折腾都对我家没影响;传地址相当于我把我家地址写个纸条给你,你对这个纸条地址怎么改我家地址还是不会变,但你是根据地址到我家来了,你对我家做的任何事都会对我家产生实际影响
#include#include void func1(char * ptr ) { ptr++; } void func2(char ** ptr ) { (*ptr)++; } void func3(char * ptr) { ++ptr; * ptr = 'E'; } int main(int argc,char**argv) { char *ptr = "hello world"; func1(ptr); printf("ptr1 = %sn",ptr); func2(&ptr); printf("ptr2 = %sn",ptr); char buffer[20] = {"hello world"}; //char buffer[20]; //buffer[20] = {"hello world"};//不能先定义后赋值 char * ptr3 = buffer; //指针的内容是数组的地址,不是指向 func3(ptr3); printf("buffer = %sn",buffer); return 0; }
注意:
1、 使用不修改实参内存空间的值时传值,即使用又修改实参变量的值时传地址,
2、传什么类型用什么类型去接,不然出错
3、一般不直接把传递的形参作为变量使用,在自定义的函数中另外定义一个临时变量使用,防止出错
4、传指针不能认为就是传地址
5、函数的调用和返回开销比较大,在一些特定情况下可以用其他方法代替,如宏定义函数等
三、函数编码规范实现高内聚,低耦合



