链表就一些包含数据的独立数据结构(通常称为节点)的集合。
在单链表中,每个节点包含一个指向链表下一节点的指针。链表最后一个节点的指针字段的值为NULL,提示链表后面不再有其他节点。在你找到链表的第1个节点后,指针就可以带你访问剩余的所有的节点。为了记住链表的起始位置,可以使用一个根指针。根指针指向链表的第1个节点。注意根指针只是一个指针,它不包含任何数据。
在一个双链表中,每个节点都包含两个指针——指向前一个节点的指针和指向后一个节点的指针。这可以使我们以任何方向遍历双链表,甚至可以忽前忽后地在双链表中访问。它存在两个根指针:一个指向链表的第1个节点,另一个指向最后一个节点。这两个指针允许我们从链表的任何一端开始遍历链表。
语句提炼是一种简化程序的技巧,其方法是消除程序中冗余的语句。
高级声明(以下全是旧式风格的声明,目的是为了让例子简单一些)
int *f( );
f是一个函数,它的返回值类型是一个指向整型的指针。
int (*f)( );
f成为一个函数指针,它所指向的函数返回一个整型值。
int *(*f)( );
它和前一个声明基本相同,f也是一个函数指针,只是所指向的函数的返回值是一个整型指针,必须对其进行
间接访问操作才能得到一个整型值。
int f[ ];
这个声明表示f是个整型数组。数组的长度暂时省略,因为我们现在关心的是它的类型,而不是它的长度。
int *f[ ]
下标的优先级更高,所以f是一个数组,他的元素类型是指向整型的指针。
int f( )[ ]; 非法的
f是一个函数,它的返回值是一个整型数组,这里的圈套在于这个声明是非法的——函数只能返回标量值,不
能返回数组。
int f[ ]( ); 非法的
f似乎是一个数组,它的元素类型是返回值为整型的函数。这个声明也是非法的,因为数组元素必须具有相同
的长度,但不同的函数显然可能具有不同的长度。
int (*f[ ])( );
这个声明是合法的。这里有两对括号,它们分别具有不同的含义。括号内的表达式*f[ ]首先进行求值,所以
f是一个元素为某种类型的指针的数组。表达式末尾的()是函数调用操作符,所以f肯定是一个数组,数组元
素的类型是函数指针,它所指向的函数的返回值是一个整型值。
int *(*f[ ])( );
这个声明创建了一个指针数组,指针所指向的类型是返回值为整型指针的函数。