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){}
语言中的指针,作为指向某个对象或函数的引用时,在功能上是跟其他语言中的引用没什么区别的。比如下面两行功能一样:
而C中指针强大的地方在于,它是可以任意被赋值的,如:
这也就使得C中的指针可以操作「任意」内存位置,而不仅仅是「指向」某个确实存在的对象。
举一个例子,考虑下面这个需求(嵌入式课某作业):
使用C指针可以轻松地解决这个问题,如:
其他语言中则不能或很难做到。
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 {我们用socket读到一段二进制数据的时候,把指向该缓存的指针,用一个强制类型转换变成一个struct eth_header*类型的指针,那么这个数据包的内容就可以很容易的读出来了。比如读源地址,只需要这样
unsigned char dst[6];
unsigned char src[6];
unsigned short int ptype;
};
unsigned char* buffer = .......这样的特性,在Java这些高级语言里面就比较难以做到。
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] );
作者:余天升
链接:http://www.zhihu.com/question/20125963/answer/14057964
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
0 0
- C语言的精髓-指针
- 为什么说指针是 C 语言的精髓?
- 为什么说指针是 C 语言的精髓?
- 关于 指针 ------------------C的精髓
- 指针才是C的精髓
- 指针才是C的精髓
- 指针才是C的精髓
- C语言专题精讲篇_4.3.指针才是C语言的精髓
- C 指针精髓
- C 指针精髓
- 黑马程序员------指针才是C语言精髓(一)
- 编程语言的精髓——C
- C语言精髓:最大公约数
- C语言精髓
- C/C++指针精髓(一)
- 谈C/C++ 指针精髓
- C/C++指针精髓 (一)
- 谈C/C++指针精髓
- 第一周项目
- C提高——数组、数组数据类型、数组数据类型指针、多维数组本质等
- tomcat启动后访问应用超时问题
- zhu的工作日记:LayoutAnimation的简单使用(android)
- Java 编程思想第四版 笔记
- C语言的精髓-指针
- OpenJudge百炼习题解答(C++)--题2690:首字母大写
- 冒泡排序--BubbleSort
- 九度OJ 1541-1550(7/10)
- 解码和编码
- uva10558
- Python基础--快速改造:字符串
- OS X从系统自带python改为Homebrew版python
- java中字符串倒序加逗号输出