知识点
函数意义、
函数参数、
函数设计原则、
函数与宏
敲黑板先看这里
你觉不觉得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语言知识框架为主线,着重强调实际经常应用!反复浏览体会可牢记,形成自己的知识框架,然后灵活应用,知识点来源于狄泰软件学习总结所得。
1094

被折叠的 条评论
为什么被折叠?



