C语言的精髓-指针

来源:互联网 发布:adsafe净网大师mac版 编辑:程序博客网 时间:2024/06/06 00:05


很多情况可以用到。这需要在编程过程中形成一种思维。如 将一个结构体传递给一个函数。如果不用指针,传送速度慢,如果通过指针,只要传递一个地址。struct  example {int i;int j;int f;char a[1024];};void main(){struct example ex;fun(&ex);//将结构体ex的地址传递给函数fun}fun(struct example *p){}


语言中的指针,作为指向某个对象或函数的引用时,在功能上是跟其他语言中的引用没什么区别的。比如下面两行功能一样:
ptr->field  // Cref.field   // Java

而C中指针强大的地方在于,它是可以任意被赋值的,如:
ptr = 0x12341234

这也就使得C中的指针可以操作「任意」内存位置,而不仅仅是「指向」某个确实存在的对象。

举一个例子,考虑下面这个需求(嵌入式课某作业):
写一个自己的简易 bootloader,能通过串口执行两条最简单的指令:

peek addr 以一个字为单位读取内存中 addr 位置的数据(addr 是 4 字节对齐,十六进制的形式,长度为 8 位十六进制,例如 0x00008000)并以十六进制的形式输出

poke addr data 以一个字为单位修改内存中 addr 位置的数据为 data(addr是 4 字节对齐,十六进制的形式,长度为 8 位十六进制,data 也是十六进制的形式,长度为 8 位十六进制)

使用C指针可以轻松地解决这个问题,如:
addr = (int*)parse_int32(line);

其他语言中则不能或很难做到。


作者:李璜
链接:http://www.zhihu.com/question/20125963/answer/40157216
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

——————————————————————————————————————————————————————————————————
——————————————————————————————————————————————————————————————————

之所以说指针是C语言的精髓,在于,你会用指针、用好指针之后,能发挥C语言的强大威力;如果你不会用,C语言绝对不会比其他的任何一种语言好。

举两个我自己比较熟悉的例子。一个是函数指针,比如一个计算一元实函数定积分的函数,可以写成如下形式
double integrate( double (*f)( double x ), double lb, double ub );
其中,lb是积分下界,ub是积分上界,f是被积函数(的指针)。这样就可以对所有double (*)(double x)形式的函数进行积分计算了。但是,如果是在Java中,实现这个功能可能就会比较麻烦。首先需要为这个计算积分的函数声明一个积分计算器的类,然后声明一个可积分的接口,能够被积分的函数的类需要继承并实现这个接口,然后再把这个被积函数的类的一个实例传给这个这个积分计算器进行计算....

另外一个用得比较多的是结构体指针。如果只把结构体当成一个数据的集合的话,那么结构体并没有什么好用的。在处理二进制格式的数据,尤其是网络数据的数据包的时候,结构体指针非常好用。比如我们定义一个以太网帧首部的格式
struct eth_header {
unsigned char dst[6];
unsigned char src[6];
unsigned short int ptype;
};
我们用socket读到一段二进制数据的时候,把指向该缓存的指针,用一个强制类型转换变成一个struct eth_header*类型的指针,那么这个数据包的内容就可以很容易的读出来了。比如读源地址,只需要这样
unsigned char* buffer = .......
struct eth_header* header = (struct eth_header*) buffer;
printf( "SRC-MAC: %02X-%02X-%02X-%02X-%02X-%02X\n",
header->src[0], header->src[1], header->src[2],
header->src[3], header->src[4], header->src[5] );
这样的特性,在Java这些高级语言里面就比较难以做到。


作者:余天升
链接:http://www.zhihu.com/question/20125963/answer/14057964
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
0 0
原创粉丝点击