C语言的指针总是会被初学者误解,特别的教材在强调函数参数的值参和形参时,极大的误导了C语言的初学者。事实上任何指针变量都是相当与系统的int型变量。拿32bit CPU的系统来说,任何指针变量的值都是一个32bit的整形值,而且语言上确实可以仅仅定义成int型的变量然后通过强制类型转换成各种实际需要的类型。而且这样的转换在嵌入式系统更是常用,比如读取一个IO上的内容*((U16*)0x80001002)。把指针认作普通的int型变量,这样你就朝指针的内涵前进了一大步,这个变量仅仅是记录了你需要的内容的物理地址,而不是内容本身。引入语言符号“&”,“*”,仅仅是为了方便在语言层次上区别你对物理地址的访问还是对普通整形值的访问,也就是说这仅仅是语言提供的便利。
再说道函数的参数类型,实实在在的仅有值参方式而不存在形参方式。实际上你使用void get_value(int o_value);还是void get_value(int *o_value_p)你都不可能将函数体内对o_value或o_value_p的修改影响到函数体外,我们常说的形参是就我们的期望而言,而不是语言本身的实现而言。也就是说如果我们期望get_value(int *o_value_p)中的参数返回一个输出值给我们,我们绝对不是访问变量o_value_p来获得的,而是访问o_value_p这个变量的值作为物理地址上的值。也就是说如果我们期望将一个变量作为函数参数,同时在函数体对这个参数的修改影响到外面,则我们转递的参数绝对不是这个变量的值,而是这个变量的地址。多极指针的情况大家可以类推,相当于将前级指针封装在int型变量上,在对这个变量的地址进行访问。
阅读(1337) | 评论(0) | 转发(0) |