深入理解指针在C语言中的应用
2012-11-14唐婷
唐婷
四川职业技术学院计算机科学系,四川 遂宁 629000
深入理解指针在C语言中的应用
唐婷
四川职业技术学院计算机科学系,四川 遂宁 629000
本文介绍指针的基本概念、特性,以及对c语言的重要性。描述指针在c语言中的应用,深入理解指针在c语言编程中所占有的地位,以及掌握这些方法对今后编程的作用。
c语言;指针;算法
c language; Pointer; Algorithm
前言
在计算机工程中指针是一个用来指示一个内存地址的计算机语言的变量。指针常常出现在比较靠近机器语言的环境,这样能更好地为底层软件的编写提供支持。指针一般指向一个函数或一个变量。在使用一个指针时,一个程序既可以直接使用这个指针所储存的内存地址,又可以使用这个地址里储存的变量或函数的值。
简单地说其实指针就像是其它变量一样,所不同的是一般的变量包含的是实际的真实的数据,而指针包含的是一个指向内存中某个位置的地址。指针可以表示各种数据对象,如简单变量、数组、数组元素、结构体、甚至是函数。
常说指针是c语言的灵魂,没有学会指针的使用,就不能说学号了c语言。现阶段c语言的主要应用于嵌入式系统、linux内核等对于性能要求高、硬件联系比较密切的领域。在下面中主要探讨三个问题:(1)c语言中指针的效率。(2)操作位段。(3)语言依靠指针实现算法。(4)指针帮助c语言简化程序。(5)指针高级声明。
1c语言中指针的效率
c语言可以说是高级语言中性能最快的,而其中指针是加快程序处理效率的保障。指针能使得c语言大大提高程序的性能,从下边的例子来看:
在函数参数传递中,如果传递的数据量比较大,函数执行又很频繁的话,使用指针就能够大大提高程序的处理速度。以传递结构为例:
定义一个比较大的结构:
这样的处理效率是很低的,再加上NUM又很大的话对于内核或者底层处理程序来说就是一场灾难。因为在c语言的参数传值调用方式要求把参数的一份拷贝传递给函数,如果NUM为1024,而且我们使用的机器上整型和浮点型都占用4个字节,那么占有空间就很大了。每次调用函数都会把这个结构复制到堆栈中,用了以后再丢弃。
如果我们采用指针的传递,如下:
这样调用函数的时候就是把一个指向结构的指针传递进去。指针比整个结构小得多,所以把它压到堆栈上效率就会提高很多。向函数传递指针的缺陷在于函数现在可以对调用程序的结构变量进行修改,如果不希望如此,可以在函数中使用const关键字来防止这类修改。
2 操作位段
用指针操作位段能使得代码阅读更方便,更接近于思维。
位段的声明和任何其他普通的结构成员声明相同,但有两个例外。首先,位段成员必须声明为int、signed int或unsigned int类型。其次,在成员名的后面是一个冒号和一个整数,这个整数指定该位段所占用的位的数目[1]。
有以下位段操作:
这样可以在声明如下结构:
这样通过下列访问方式,就能更方便的访问位段信息:
3 语言依靠指针实现算法
最广为人知的就是链表的实现。有了指针,c语言实现链表就变的简单,使用也很方便。比如下单向链表:
是一个最简单的单向链表,如果没有指针的帮助,c语言要想实现也是很困难。使用指针可以很优雅的实现链表:
通过上述定义的struct就能很容易的实现链表,并且在链表的插入、删除、遍历都能很直观的使用。其他涉及指针的算法就很多了,比如二叉树、堆、队列等等,c语言都能使用指针方便的实现。
简单介绍一下双向链表的插入,能更深入的了解链表对于插入、删除的方便性。双链表的插入会出现三种情况:(1)新值可能插入中间位置。(2)新值可能插入链表头。(3)新值可能插入链表尾。这里介绍新值插入中间位置的方法。
插入的new只需要修改指针的顺序就可以:
4 指针帮助c语言简化程序
c语言没有面向对象编程,但是可以利用指针,模拟出来,简化程序。比如最具代表性的是在linux内核协议栈里,对于多协议的处理,可以采用同一段代码来实现,但是对于不同的传输协议,比如tcp、udp等使用的不同的处理函数。这里要灵活使用函数指针,大大简化程序,提高效率。比如在Netfilter的处理中,对于不同传输协议都采用同一段代码,首先注册不同协议的处理函数。
注册tcp的处理函数:
在使用的时候只需要查找到该处理函数即可用同一段代码处理不同的协议:
使用该方法可以在整个程序的任何地方,只需要先查找是属于何种处理方法,就能处理不同的函数。能使得同一段代码,处理不同的事件,提高代码效率。
5 指针高级声明
高级的指针类型在linux内核,以及一些底层软件上面应用很广泛,虽然看上去会觉得比较难以理解,但是一旦理解以后编程会变得比较快捷。
比如函数指针:
从以上几个函数指针可以看到,灵活这几类指针对于函数的声明,以及在面向对象的设计的时候都能应用到。
下面来分析两个比较复杂的高级声明:
def是一个二级指针,它指向的是一个一维数组的指针,数组的元素都是int。
int *(*def)[20];
def是一个指针,它指向一个一维数组,数组元素都是int*。
6 结语
指针虽然有时候让代码看上去比较难以理解,但从以上几个方面可以看到,不管是在执行效率,对于硬件操作的支持,都具有无可比拟的威力,对我们在实现各种复杂的算法,直接处理硬件上面都提供了很大的方便。
[1] Kenneth A.Reek.C和指针[M].北京:人民邮电出版社,2008.4
[2] Benvenuti.C.深入理解LINUX网络技术内幕[M].北京:中国电力出版社,2009
[3] W.Richard Stevens.TCP/IP 详解 卷1:协议[M].北京:机械工业出版社,2007.8
Understanding pointers in c language applications
Tang ting
Sichuan Vocational and Technical College, suining 629000 China
This article describes the basic concepts of pointers, features, and the importance of clanguage. Pointer in c language describes the application of indepth understanding ofthe pointer in c programming language the status of occupied, and the master of these methods for future programming role.
TP319
A
10.3969/j.issn.1001-8972.2012.10.061