您的位置:首页 > 编程语言 > C语言/C++

C语言编程指针的应用场合

2010-08-07 19:53 274 查看
参加工作两年了,第一次在CSDN写博客。由于一直从事的是手机嵌入式开发,因此和C语言,和指针也就打了两年交道。

网络上有不少牛人写了关于C语言指针的各种使用方法,主要是大谈语法规则类的,在此,我想主要写一下C语言指针的实际应用。

写作提纲如下:

指针的应用场合:
1,动态内存分配,链表操作。
2,作为函数参数,间接地传引用调用。指针加const修饰符。
3,作为函数返回值。
4,作为函数参数,传递数据,避免结构体类型的大量数据拷贝。特别是作为void类型数据指针。
5.1 作为回调函数,实现同步机制。
5.2 形成函数指针数组,作为设备驱动程序规范。
5.3 形成函数指针数组,作为菜单执行的动作。
5.4 作为设计原则,接口与实现分离:如brew的AEE,OEM层。

1,动态内存分配,这是指针最常见的用法。和动态内存相对应,静态内存主要是局部变量,全局变量,以数组为例,探究哪些场合更应该使用指针。如果数组定义在函数之内,这带来了三个限制:

a,数组大小不能过大,因为数组的内存是分配在栈空间,对于每一个进程来说,栈大小是固定的,且栈空间一般不大。如果函数调用时多层嵌套,那么定义大的数组就很容易导致栈空间溢出,改写了其他进程的栈空间,带来一些莫名奇妙的问题,debug时很难定位。

b,数组的内存大小是确定后,就无法更改,因此必须分配足够大的内存空间,这就可能导致内存浪费。

c,数组的内存分配在函数内部,这样的内存空间无法带到函数外。

对于这三个限制,动态内存分配很好地解决。动态内存是分配在堆空间,一般来说有足够的空间,而且可以对malloc的返回值作判断是否分配成功。另外,使用链表这样的数据结构,可以灵活的分配内存,释放内存,再者,堆空间是可以带出函数外的。

如果是全局数组,当然不用担心栈空间溢出,内存无法带出函数外的问题,但是毕竟内存是有限的,不能为了某一个应用,长时间占据很大的内存,而且数组对于插入一个数据,删除一项数据算法比较麻烦。因此动态管理内存,采用链表的方法是必须的。

当然,动态内存分配,采用链表的数据结构,会带来自身的空间占用,如pNext指针,pPrev指针。因此,总结起来:当使用的数据量比较大,且范围变化又比较大的时候,可以考虑使用指针;全局变量可以用在需要共享内存,而数据量不是特别大的场合。局部变量,用在中间过程。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: