C语言中关于函数的总结

知识点

函数意义、
函数参数、
函数设计原则、
函数与宏

敲黑板先看这里

你觉不觉得C语言基础知识概念在头脑里没有形成知识体系?是否比较模糊比较乱?这就对了?我之前也是,有些知识点时间长了容易忘或者混淆,有些初学者抓不住重点觉得C语言复杂,难!实不相瞒,我也是这样的感受,于是我想是时候整体的把C语言给好好的总结一下了,这样形成一个知识体系,就不容易忘,也不容易混淆,这就是这次总结的意义所在。
分为几个板块总结:数据类型、指针与数组、字符串、多维指针与多维数组、函数、内存分配与操作问题、符号总结、控制语句、以及编译方面的问题。
总结宗旨:绝不专牛角尖!主要围绕常用应用知识为主,突出重点,能够很好的形成知识架构。比如:总结了float一般就不会再总结double,这样做没有多大意义,相反的,把重要的拿出来好好分析一下,是很有意义的,而相似的东西就可以举一反三了。实际上就这些知识点,概念搞明白后,C语言就通透多了

函数意义

1.计算机发展初期,人们认为:程序 = 数据 + 算法;由此推导出:C程序 = 数据 + 函数;

2.初期程序采取模块化设计,即:复杂的问题分解为一系列简单的问题来解决。C语言中的模块化则由函数来代表,分为各种模块函数,然后组成程序,这就是面向过程的思维;面向过程是一种以过程为中心的编程思想;首先将复杂的问题分解为一个个容易解决的问题,分解后的问题可以按照步骤一步步完成,函数是面向过程在C语言中的体现,解决问题的每个步骤可以用函数来实现。

3.函数声明:告诉编译器程序单元的存在;函数定义:明确指示程序单元的意义;严格意义上的声明与定义并不相同。C语言中通过extern进行程序单元声明,而一些程序单元在声明时可以省略extern。

函数参数

1.函数参数在本质上与局部变量相同,都是在栈上分配空间,函数参数的初始值是函数调用时的实参值 函数参数的求值顺序依赖于编译器的实现,程序中存在一定的顺序点,顺序点指的是执行过程中修改变量值的最晚时刻,在程序到达顺序点的时候,之前所做的一切操作必须完成,
C语言中的顺序点:

每个完整表达式结束时,即分号处;
&&,||,? : ,以及逗号表达式的每个参数计算之后;
函数调用时所有实参求值完成后(进入函数体之前);

2.数组参数:C语言中只会以值拷贝的方式传递参数,如果当向函数传递数组参数时:会将整个数组拷贝一份传入函数,此时参数传递的时候如果拷贝整个数组,那么执行效率会大大下降,并且参数位于栈 上,太大的数组拷贝将导致栈溢出。因此:

数组参数会退化为指针,此时将数组名看作常量指针传数组首元素的地址.

2.二维数组参数同样存在退化的问题:二维数组可以看作是一维数组,二维数组中的每个元素是一维数组
void f(int a[5]) <–> void f(int* a);
void g(int a[3][3]) <–> void g(int (*a)[3]);

3.指针参数:与一般的传值方式一样,拷贝的是指针变量的值,即地址;指针本身是没有改变的,因此传指针参数的目的:在函数体内部用*号即可改变指针参数所指向的函数外部的值,或者使用外部的值。
注意:这个与在函数体内部声明指针变量是不一样的。

函数设计原则

设计函数的时候应该注意的点:

  • 函数从意义上应该是一个独立的功能模块;
  • 函数名要在一定程度上反应函数的功能;
  • 函数参数名能够体现参数的意义;
  • 尽量避免在函数中使用全局变量;
  • 当函数参数不应该在函数体内部被修改时,应加上const声明;
  • 如果参数是指针,且仅作输入参数,则应加上const声明;
  • 不能省略返回值类型,如果函数没有返回值,那么应声明为void类型。
  • 对参数进行有效性检查,对于指针参数的检查尤为重要;
  • 不要返回指向“栈内存”的指针,栈指针在函数体结束时被自动释放;
  • 函数规模要小,尽量控制在80行代码之内;
  • 相同的输入对应相同的输出,避免函数带有“记忆”功能;
  • 避免函数有过多的参数,参数个数尽量控制在4个以内。

函数与宏

函数与宏的区别:

  • 宏是由预处理器直接替换展开的,编译器不知道宏的存在;
  • 函数是由编译器直接编译的实体,调用行为由编译器决定;
  • 多次使用宏会导致最终可执行程序的体积增大;
  • 函数是跳转执行的,内存中只有一份函数体存在;
  • 宏的效率比函数要高,因为是直接展开,无调用开销;
  • 函数调用时会创建活动记录,效率不如宏;
  • 宏的效率比函数稍高,但是其副作用巨大;
  • 宏是文本替换,参数无法进行类型检查;
  • 可以用函数完成的功能决不用宏;
  • 宏的定义不能出现递归定义;

总结

以上总结以C语言知识框架为主线,着重强调实际经常应用!反复浏览体会可牢记,形成自己的知识框架,然后灵活应用,知识点来源于狄泰软件学习总结所得。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值