在嵌入式行业摸爬滚打有8年左右的时间了,对C语言有颇多的感触和认识,本文就畅聊一下关于C语言的深入学习部分。每次想到C语言的深入学生都让我想到王国维的读数的三重境界”昨夜西风凋碧树,独上高楼,望尽天涯路。” 此第一境也。 “ 衣带渐宽终不悔,为伊消得人憔悴。” 此第二境也。 “ 众里寻他千百度,蓦然回首,那人却在,灯火阑珊处。”此第三境也。其实在学习C语言的时候也是有三种境界,我理解的C语言的三重境界是:“境界一:C语言语法的学习。境界二:编程逻辑和编程思维的形成。境界三:如何操作内存”,以上是我理解的C语言的三重境界。第一重境界是最容易达成的,因为C语言的语法通过书籍或者通过老师的讲解我们就能够理解和使用。第二重境界的达成对初学者相对来说不是那么容易,因为这个过程需要你日复一日的积累,需要你大量练习之后完成量变到质变的过程。第三重境界的达成不是你日复一日的练习,不是大量的重复就能够完成的事情,主要的原因就是你要对C语言的实质理解,比如变量类型开辟内存,比如指针操作内存,在比如内存区间的划分等等,这些都属于第三重境界的内容。在第三重境界中一个指针的部分就能让很多初学者望尘莫及。更别提完成第三重境界了。这三重境界如何达到那?我个人认为第一重境界的达成需要一本完整的C语言的书籍或者有一个老师带你学习,后者可能让你更迅速的达到C语言基础知识的积累。第二重境界的达成只能自我多练习才能达成,成功的路上是没有捷径可走的,如果每天坚持500行代码,相信坚持不到1年的时间这重境界也就初步达成了。最后一重境界的达成需要个人多理解,对一个知识点的理解要从内部实现充分理解,这部分的达成没有时间限制,有部分人可能第二重境界达成之后三重境界也就达成了,但是有部分人经过好多年依然对这部分不能很好的掌握,这个境界的达成重在对C语言内部原理的理解。学习的过程就像练功一样,招式有形,出招的方式无形,学习有型,对知识的理解无形。所以本文接下来就从有形的部分介绍下指针。
要了解指针,多多少少会出现一些比较复杂的类型,所以我先介绍一下如何完全理解一个 复杂类型,要理解复杂类型其实很简单,一个类型里会出现很多运算符,他们也像普通的表 达式一样,有优先级,其优先级和运算优先级一样,所以我总结了一下其原则: 从变量名处起,根据运算符优先级结合,一步一步分析. 下面让我们先从简单的类型开始慢慢分析吧:
int p;
这是一个普通的整型变量
int *p;
首先从 P 处开始,先与*结合,所以说明 P 是一个指针,然后再与 int 结合, 说明指针所指向的内容的类型为int型.所以P是一个返回整型数据的指针
int p[3];
首先从 P 处开始,先与[]结合,说明 P 是一个数组,然后与 int 结合, 说明数组里的元素是整型的,所以 P 是一个由整型数据组成的数组
int *p[3];
首先从 P 处开始,先与[]结合,因为其优先级比*高,所以 P 是一个数组, 然后再与*结合,说明数组里的元素是指针类型, 然后再与 int 结合, 说明指针所指向的内容的类型是整型的,所以 P 是一个由返回整型数据 的指针所组成的数组
int (*p)[3];
首先从 P 处开始,先与*结合,说明 P 是一个指针,然后再与[]结合 (与"()"这步可以忽略,只是为了改变优先级), 说明指针所指向的 内容是一个数组,然后再与 int 结合, 说明数组里的元素是整型的. 所以 P 是一个指向由整型数据组成的数组的指针
int **p;
首先从 P 开始,先与*结合,说是 P 是一个指针,然后再与*结合, 说明指 针所指向的元素是指针,然后再与 int 结合, 说明该指针所指向的元素 是整型数据.由于二级指针以及更高级的指针极少用在复杂类型中, 所 以后面更复杂的类型我们就不考虑多级指针了, 最多只考虑一级指针.
int p(int);
从 P 处起,先与()结合,说明 P 是一个函数,然后进入()里分析,说明该函数有一个整型变量的参数,然后再与外面的 int 结合, 说明函数的返回值是一个整型数据
Int (*p)(int);
从 P 处开始,先与指针结合,说明 P 是一个指针,然后与()结合,说明指针指向的是一个函数,然后再与()里的//int 结合,说明函数有一个 int 型的参数,再与最外层的 int 结合,说明函数的 返回类型是整型,所以 P 是一个指//向有一个整型参数且返回类型为整型的函数的指针
int *(*p(int))[3];
从 P 开始,先与()结合,说明 P 是一个函数,然后进入()里面, 与 int 结合,说明函数有一个整型变量参数,然后再与外面的*结合,说明函数返回的是一个指针, 然后到最外面一层, 先与[]结合,说明返回的指针指向的是一个数组,然后再与*结 合,说明数组里的元素是指针,然后再与 int 结合,说明指针指向的内容是整型数据.所以 P 是一个参数为一个整数据且返回 一个指向由整型指针变量组成的数组的指针变量的函数.
说到这里也就差不多了,我的任务也就这么多,理解了这几个类型,其它的类型对我们来说也是小菜了,不过我们一般不会用太复杂的类型,那样会大大减小程序的可读性,请 慎用,这上面的几种类型已经足够我们用了。最后希望正在阅读次文章的你尽快完成C语言的三重境界。