您的位置:首页 > 其它

声明是如何形成的

2017-05-17 21:07 169 查看
C语言中的声明器,声明器就是标识符以及与它组合在一起的任何指针、函数括号、数组下标。

函数的返回值不能是一个函数,但允许是一个函数指针。

函数的返回值不能是一个数组,但可以是一个指针,或者指向数组的指针。

数组里面不能有函数,但允许数组里面还有数组。

位段的类型必须是int,unsigned int或者signed int,只有在这个地方,int类型数据需要区分三种形态,int,signed int,unsigned int。

p61:有些C语言书籍声称“在调用函数,参数按照从右到左的次序压到堆栈里。”这个说法过于简单了,如果你有一本这样的书,请把这一页烧掉。

参数在传递时首先尽可能地存放到寄存器中(追求速度)。注意,int型变量i跟只包含一个int型成员的结构变量S在参数传递时的方式可能完全不同。一个int型参数一般会被传递到寄存中,而结构参数则很可能被传递到堆栈中,第二点需要注意的是,在结构中放置数组,可以实现数组的赋值。

struct s_tag{ int a[100];};

struct s_tag orange,lime;

如果现在我赋值给orange里面的数组1-100的数据,我可以直接lime=orange;这样,lime结构中的数组就被直接赋值了,而传统的数组是不允许整个拷贝的。

在结构中,每个成员依次存储,而在联合(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)指针。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: