再议c语言的直接访问和间接访问
最近我在看uboot的源码,顺便提高一下自己的编程水平,发现了一些规律,最近会记录下来,今天要讲解记录的是“直接访问”和“间接访问”。
首先,说一下变量,在c语言中从宏观角度出发进行分类可以分成2大类,一种是普通变量,另外一种是指针变量。然后,从宏观上看这些函数内部其实就是对这些“普通变量”、“指针变量”进行读写操作。
普通变量如果想进行写访问是可以直接使用赋值运算符“=”实现的,如果考虑结构体变量的成员需要用到“.”运算符,如果想要实现读操作,那就可以作为赋值运算符的右值,或者函数传参的时候直接使用变量名实现。
再说一下指针,也就是地址。现在大家思考一下C语言是有什么构成的呢?答案是变量、代码、常量(字符串)。这些对象共用的属性或者说特征是什么呢?我的答案是都有对应的地址,也就是指针。无论这个变量有多多复杂,无论这个函数有多长,这些对象都是有一个地址值的,这是他们的共性,也就是地址值。那如何实现这些对象的读写操作呢,对于普通变量C语言可以和前面说的可以直接访问,那对于代码、常量(字符串)这些是无法直接访问的,那有什么办法呢?我的回答是利用它们的共性指针(地址)通过c语言定义的指针运算符(& -> *)实现。通过指针的方式实现对复杂对象的读写操作,我这里叫做间接访问,因为是通过一个指针变量或者指针实现的。可能有人会问,函数访问是函数调用,也是通过指针或者指针变量吗?我的答案是的,函数名其实就是函数代码的首地址,传递的参数值就是输入量,函数名+参数传参其实就是指针访问的一个“语法糖”内部也是通过指针运算法实现的。
时刻牢记一句话,C语言中所有的对象都有指针这一个“句柄”属性,无论这些对象多么复杂,存储在哪里,只要有了这个“句柄”就可以找到指向内容并读写操作。
c语言不支持结构体变量整体访问,而只支持访问结构体成员。
再议间接访问,现在大家思考这样一种情况,有一个函数,传参变量中有一些指针变量。如果不看这个函数被哪里调用,只看函数内部内容通过运算符“->”是无法知道具体结构体变量名是什么的。也就是运算符"结构体指针变量->结构体成员"C语言的这种写法是隐藏了结构体整体(这个具体的大的对象)而是直接到了结构体的具体成员,这里的原因是C语言不支持结构体整体访问。
最后,“指针是C语言的灵魂”这句话要是靠牢记,有了指针一切就迎刃而解。
