1.提高代码的复用性。
2.提高代码的维护性。
3.迭代开发,可扩展开发。
①函数名:(自助解释性,即可读性)
举例:delete_ch_count_min最多不能超过5个
动词+名词
get_user,insert_user
函数名也是一个指针常量,保存的是函数存放的地址(函数的入口地址)
②函数调用
1.通过函数名找到函数的入口地址
2.给形参分配内存空间
3.传值:把实参变量对应空间的值传给形参
4.执行函数体里的语句
5.函数返回并释放内存空间
读(不修改)实参变量对应的内存空间的值时,传实参变量名。
写(修改)实参变量对应内存空间的值时,传实参变量的地址。
1#include<stdio.h>
2 char *func(int *num)
3 {
4 int count = 5;
5 char *src = "hello world";
6 *num = 5;
7 return src;
8 }
9 int main()
10 {
11 int num;
12 char src[100] = "hello";
13 char *ptr = func(&num);
14 printf("ptr = %s\n",ptr);
15 printf("num = %d\n",num);
16 return 0;
17 }
传出函数:num是一个空的值
传入函数
sleep(5)代表延迟5秒后打印。
exit(1)结束整个程序,头文件为#include<stdlib.h>
echo $?当前结束程序的返回值。
返回局部变量的地址很危险,容易被释放。
return 不能返回局部变量的地址。
调用函数要对返回值作出判断。
要进行入口参数检查,最好不要依赖于别人已经实现的函数。
if(src==NULL ||dest==NULL)
{
return NULL;
}
int(*p_func)(int,int)
其中p_func = add;为入口地址
P_func=&add;为整个数组的地址
回调函数:回调函数是一个通过函数指针调用的函数,如果你把函数指针(函数的入口地址)传递给另一个函数,当这个函数指针被用来调用它所指向的函数时,我们就说这个函数是回调函数。
三.用c语言如何实现面向对象?c语言哪些点体现了面向对象。
封装: 所谓封装,通俗地说,就是一个姑娘化了妆,只给你看她想让你看的那一面,至于里面是否刮了骨、垫了东西,不给你看。说到封装就得说隐藏,这是对兄弟概念;其实我理解隐藏是更深的封装,完全不给你看见,而封装可能是犹抱琵琶半遮面。封装在 C++ 语言中有 protected 、 private 关键字在语言层面上支持,而 C 语言中没有这些。 C 有结构体( struct ),其实可以实现封装和隐藏。为了更好的隐藏一个类的具体实现,一般是一个公开头文件、一个私有头文件,私有头文件中定义实现的内部细节,公开头文件中定义开放给客户程序员的接口和公共数据。
继承:什么是继承?在面向对象层面上不讲了,只说语法层面。语法层面上讲,继承就是派生类拥有父类的数据、方法,又添了点自己的东西,所谓子承父业,发扬光大。在 C 语言中可以用结构体的包含来实现继承关系。
多态:
1.在“基类”中显式声明一个 void** 成员,作为数组保存基类定义的所有函数指针,同时声明一个 int 类型的成员,指明 void* 数组的长度。
2.“基类”定义的每个函数指针在数组中的位置、顺序是固定的,这是约定,必须的
3.每个“派生类”都必须填充基类的函数指针数组(可能要动态增长),没有重写虚函数时,对应位置置 0
4.“基类”的函数实现中,遍历函数指针数组,找到继承层次中的最后一个非 0 的函数指针,就是实际应该调用的和对象相对应的函数实现
四.函数的数组指针
int(*func_array[3])(int,int);
func_array[0]=add;
func_array[1]=sub;
func_array[2]=mul;
int i;
for(i=0;i<3;i++)
{
func_array[i](num1,num2);
}
函数的可变参数:
1)首先在函数里定义一个va_list型的变量,这里是arg_ptr,这个变
量是指向参数的指针.
2)然后用va_start宏初始化变量arg_ptr,这个宏的第二个参数是第
一个可变参数的前一个参数,是一个固定的参数.
3)然后用va_arg返回可变的参数,并赋值给整数j. va_arg的第二个
参数是你要返回的参数的类型,这里是int型.
4)最后用va_end宏结束可变参数的获取.然后你就可以在函数里使
用第二个参数了.如果函数有多个可变参数的,依次调用va_arg获
取各个参数.
int main(int argc,char *argv[])
argc指个数,真正的参数从argv[1]开始,argv[]里面存的是形参的个数
五.如何给c语言写注释
举例1.int flag = 1;//正负标识位
2.int result = 0;//保存最终结果
3.result = result * 10(*src - ‘0’)//eg:’1’-’0’=1; 1*100+2*10+3*1=123;
//行级注释
/**/块级注释