声明是如何形成的
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)指针。
欢迎加入作者的小圈子
扫描下方左边二维码加入QQ交流群,扫描下方右边二维码关注个人微信公众号并获取更多隐藏干货,QQ交流群:816747642 微信公众号:Crystal软件学堂
![](https://images.cnblogs.com/cnblogs_com/yangguang-it/1907263/o_201227061707QQ20201227141844.png)
![](https://images.cnblogs.com/cnblogs_com/yangguang-it/1704156/o_200415115115qrcode_for_gh_5c7d1da35871_258.jpg)
作者:Crystal软件学堂 bilibili视频教程地址:https://space.bilibili.com/5782182 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在转载文章页面给出原文连接。 如果你觉得文章对你有所帮助,烦请点个推荐,你的支持是我更文的动力。 文中若有错误,请您务必指出,感谢给予我建议并让我提高的你。 |