C语言中的声明器,声明器就是标识符以及与它组合在一块儿的任何指针、函数括号、数组下标。数组
函数的返回值不能是一个函数,但容许是一个函数指针。安全
函数的返回值不能是一个数组,但能够是一个指针,或者指向数组的指针。函数
数组里面不能有函数,但容许数组里面还有数组。测试
位段的类型必须是int,unsigned int或者signed int,只有在这个地方,int类型数据须要区分三种形态,int,signed int,unsigned int。spa
p61:有些C语言书籍声称“在调用函数,参数按照从右到左的次序压到堆栈里。”这个说法过于简单了,若是你有一本这样的书,请把这一页烧掉。指针
参数在传递时首先尽量地存放到寄存器中(追求速度)。注意,int型变量i跟只包含一个int型成员的结构变量S在参数传递时的方式可能彻底不一样。一个int型参数通常会被传递到寄存中,而结构参数则极可能被传递到堆栈中,第二点须要注意的是,在结构中放置数组,能够实现数组的赋值。调试
struct s_tag{ int a[100];};blog
struct s_tag orange,lime;编译器
若是如今我赋值给orange里面的数组1-100的数据,我能够直接lime=orange;这样,lime结构中的数组就被直接赋值了,而传统的数组是不容许整个拷贝的。io
在结构中,每一个成员依次存储,而在联合(union)中,全部的成员都从偏移地址零开始存储。这样,每一个成员的位置都重叠在一块儿,在某一时刻,只有一个成员正真存储于该地址。若是存储数据时是一种类型,但在提取该数据时却成了另外一种类型,这显然存在着明显的类型不安全性,可是能够节约空间。
enum枚举,在缺省状况下整形值从0开始,而后依次增长,若是想打破依次增长的规律,能够:
enum sizes {a=2,b,c=5,d};这样a=2,b=3,c=5,d=6。define定义的名字在编译时就丢弃了,而枚举名字则一般一直在调试器中可见。还有,枚举类型在C语言中是常量,能够用枚举的变量定义数组的维数足以证实这一点(并且排除了VLA这种状况,使用不支持c99的编译器测试的)。
关于这里的C,也就是第三条,书上描述不够完备,好比const int a; int const a;是同样的,因此上面C条款应该改为,若是const或volatile的前面或者后面紧跟类型说明符。。。。后面保持同样。
如今来分析一下这个声明:
char * const *(*test)();
首先找到标识符,而后看优先级和结合性。
test是一个指针,这个指向一个函数,这个函数的参数为空,函数的返回值为一个指针,这个指针指向只读的指向char类型的指针。可能最后那里有点拗口,最后那句表示这个指针指向一个char *const的数据类型,其中const是修饰左边的星号的,表示这是一个指针常量(指针是常量,准确说是指针是只读变量),那么连起来就是最后函数返回一个指针,这个指针指向一个指向char类型的只读(const)指针。