C专家编程-Chapter3 C语言声明

char (*j)[20]; //j是一个指向数组的指针,数组内有20个char元素

j = (char (*)[20])malloc(20); 如果把星号两边看上去多余的括号拿掉,代码变成非法的。

const int * grape;

int const * grape;

int * const grape;  最后一种情况下指针是只读的,而两外两种情况下,指针所指向的对象是只读的。对象与指针都是只读的情况:

const int * const grape;

int const * const grape;

C语言的声明器(declarator)

9f2e56ea24b8f8e5d439c92d.jpg

C语言中的声明

8f6064ed661fcd7979f0552a.jpg

函数的返回值不能是一个函数可以是一个函数指针,函数的返回值不能是一个数组,可以使是一个指向数组的指针,数组里不能由函数,但允许有函数指针。

结构:在结构的定义后面跟一些变量名,表示这些变量的类型是这个结构。如:

struct { ……} plum, pomegranate, pear;

可以在struct关键字后面加一个可选的“结构标签”:

struct fruit_tag { ……} plum, pomegranate, pear;   以后可以用struct fruit_tag作为struct { ……}的简写形式。推荐用法:声明结构时始终用结构标签最好加上_tag,把变量的声明和结构的声明分开。

struct fruit_tag pear, plum;

结构中允许存在位段、无名字段以及对齐所需的填充字段。这些通过在字段的声明后面加一个冒号以及字段位长的整数来实现的。

         struct pid_tag{

                   unsigned int inactive : 1;

                   unsigned int : 1;  //1个位的填充

                   unsigned int refcount : 6;

                   unsigned int : 0;   //填充到下一个字边界

                   short pid_id;

                   struct pid_tag *link;

         };

这种用法通常被称作”深入逻辑元件的编程”。

函数参数传递时,int型的变量i会被传递到寄存器中,而结构参数很可能传递到堆栈中。

在结构中放置数组的用法,如struct s_tag  { int a[100];}; 现在可以把数组当做第一等级的类型,用赋值语句拷贝整个数组,以传值调用的方式将它传递到函数,或者把它作为函数的返回类型。

联合(union):在结构中,每个成员依次存储,而在联合中,所有成员都从偏移地址零开始存储,从而每个成员的位置都重叠在一起:在某一时刻,只有一个成员真正存储于该地址。其他就和结构一样了。联合一般是作为大型结构的一部分存在的。他可以用来节省空间,因为有些数据项是不可能同时出现的,把一些互相排斥的字段存储于一个联合中。如    

union sec_char{

                   char has_fur;  //有脊椎动物才有毛皮

                   short num_of_legs_in_excess_of_4;  //无脊椎动物才有超过4条腿

         };

         struct creature{

                   char has_backbone;

                   union sec_char form;

         };

联合还可以把同一个数据解释成两种不同的东西,而不是把两个不同的数据解释为同一种东西。

union bits32_tag{

                   int whole;  //一个32位的值

                   struct {char c0, c1, c2, c3; }byte;  //4个8位的字节

}value;

这个联合允许程序员提取整个32位值,也可以提取单独的字节段如value.byte.c0等。

枚举(enum):定义和结构、联合一样,只是把一串名字和一串整型值联系在一起。缺省是从0开始,如果对其中一个标示符进行了赋值,那么紧接其后的那个标示符的值就比所赋的值大1,依次类推。#define定义的名字一般在编译时被丢弃,而枚举则通常在调试器中可见,可以在调试代码时用它们。

转载于:https://www.cnblogs.com/aquar/archive/2010/04/04/3451465.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值