学生时代,你有遇到过像我这样理解C语言的吗?
首先是C语言整体的脉络,C语言包括哪些东西?哪些部分需要着重理解?这是我经常问自己的两个问题。
最基本的一些数据类型及其所占用的内存大小,还有一些基础的计算机常识,比如进制转换等,这些东西在对C语言有了一定的了解后都是比较容易的。
顺序语句:就是从上到下没有判断,一步到底的语句。
选择语句:就是if和switch语句,在特定的场合,switch语句使用会使程序看的简单明了,尤其是选择情况较多的时候,大多数时候if语句用的多一点。
循环语句:就是while、do...while和for语句。
在多层循环中,尽可能把最长的循环放在最外围,节省cpu的资源。
不能在循环体内修改循环变量,防止循环失控。
循环尽可能的短,太多行的循环代码会大大的影响阅读。解决方法:使用子函数处理。
把循环嵌套控制在3层以内,超过三层,对代码的理解难度大大增加了。
for语句的控制表达式不能包含任何浮点类型的对象。
还有就是break和continue语句,经常会有人问我,这两个关键字跳出的是什么?
break是跳出离它最近的一个循环,switch中的是跳出switch,不是跳出循环,continue也是一样。
数组我把它分为两个:普通数组和字符串。
其中对字符串的操作就是C语言考核的最关键的一步,因为其涉及到了数组和指针,把字符串操作的很牛的人,他们对指针的理解一定很深。
普通数组:一维数组的内容不是太多,但是对算法的要求比较高,最基础的是一定要会冒泡和选择排序,这两种算法最基础,但也是在排序上用的最多的。
如果会更好的算法的话另外谈,有兴趣的话可以对算法这一块深入研究。
二维数组的话,要理解其内存的分配情况,元素的存放顺序,会对二维数组进行输入输出,其他的就是算法了,以后慢慢去研究去。
字符串:字符串这部分的话,因为C语言对字符串的操作不像c++那么容易,所以,要对指针和数组这块下一点功夫。
最简单的就是将string.h库函数中的strlen、strcmp、strcpy、strncmp这几个函数自己实现一篇,使用指针的方式。
指针:当初老师讲指针的时候,说了一句,如果你把指针学会了,C语言你就掌握了70%。
当初我还有些怀疑,现在的我十分赞同这句话。
指针就是C语言的精华所在,C语言是一门软硬通吃的语言,归根到底就是这个指针的知识,他能直接操控底层。
这个例子当时给我的印象非常深,那以后我感觉我对指针的理解顿时清楚了很多,非常感谢我的C语言启蒙老师,有了他的带领,我才能对C语言有深一步的理解。
函数的话,我感觉就是main函数的一个延伸,但它是可重复调用的,你可以把一些繁杂的步骤写到一个函数里面,这样main函数才不会显得太臃肿。
函数最重要的就是它的格式,返回值+函数名+(形参)+函数体,其中有一个容易忽视的点就是,当形参是一个指针的时候,在函数开始时,要进行入口参数检查,就是对指针是否为空进行判断,要不然容易出现段错误。
还有一个就是,如果一个函数在main函数下面,最好进行一下声明,虽说现在的编译器已经帮我们省略了这一步骤,但我们还是要养成良好的习惯,毕竟如果给你一个旧版本的编译器的话,就会报错。
编译器的优化并不是我们偷懒的理由,不过我们也可以将函数写在main函数上方,这样的话就不需要考虑这个问题了。
Static全局变量:作用范围局限于源文件,不可被源文件的其他文件使用。
局部变量:局限于特定函数,出作用域不释放,函数结束后依然存在。
函数:作用范围局限于源文件,不可被源文件的其他文件使用 函数名在其它文件不可见。
const:这个关键字其实只要记住一局诗:近水楼台先得月!最靠近const的那个就是不能变的。
extern:这个关键字一般是用在.h头文件中,声明函数,不是本文件中的。
struct:结构体,包含多种数据类型的变量,在数据结构中经常用到,比如说:链表、栈和队列等。
enum枚举:和define的功能差不多,枚举和宏其实非常类似,宏在预处理阶段将名字替换成对应的值,枚举在编译阶段将名字替换成对应的值。
union共用体:和结构体的结构差不多,但是结构体的各个成员会占用不同的内存,互相之间没有影响。
而共用体的所有成员占用同一段内存,修改一个成员会影响其余所有成员,一般用来测试系统的大小端。
到这边,C语言的内容其实就差不多了,除了其他一些零零碎碎的小知识点。