指针与数组之间的关系非常密切。只要是用到了数组下标的程序,就肯定有一种基于指针的版本。在C语言程序里必须小心谨慎使用指针。
对一个指针变量使用递增操作符将使该指针指向它基类型的下一个元素。C语言既不检查、也不保证如此计算出来的地址是否真的存在一个给定基类型的元素。
数组名其实指向该数组中第一个元素的指针,下标则是从该数组中的第一个元素算起的偏移量。第一个元素的偏移量是0。因此,如果一个数组包含n个元素,它的下标取值范围应该是从0到n-1、而不是从1到n。
一个数组的地址和这个数组中的第一个元素的地址是有区别的:这两种地址的类型是不同的,这种区别主要体现在对地址进行算术运算时的递增/递减量方面。
程序员可以利用一连串的指针构造出各种复杂的数据结构并对之进行处理。但指针的强大威力也正是它的危险所在:复杂的指针链不仅难以阅读和理解,它们的可靠性也很难得以保证。
结构为程序员提供了一种封装一组相关数据的简便方法。
如果运用得当,宏可以成为提高程序可读性和编程效率的有力工具;但如果运用不当的话,它也会像C语言其它功能那样导致多种难以调试的错误。
C语言的预处理器并不了解C语言。不过,只要严格遵守以下规则,绝大多数隐患是可以避免的:
规则1:只要一条宏定义语句包含有操作符,就应该用括号把它括起来。
规则2:宏定义越紧凑越好;表达式比语句好,单条语句比多条语句好。
规则3:在宏定义里一定要注意避免使用会导致二义性或副作用的C语言元素。在宏定义里避免使用有副作用的表达式。
规则4:一定要让对宏进行扩展而得到的字符串--不管是一个表达式、一条语句(不包括表示语句结束的分号)、还是一个语句块--成为一个完整的C语言元素。
规则5:宏越简单越好,如果无法得到一个简单的宏,就应该把它定义成一个函数。
文章评论(0条评论)
登录后参与讨论