您的位置:首页 > 编程语言 > C语言/C++

非典型性C语言教程- 1.6 结构,共用体,常量和typedef

2007-07-26 09:04 309 查看
结构是C语言中一种定义复合变量的形式。语法类似
struct myclass{
int a;
int b;
}
结构变量是一种值类型,tr而不是指针。结构变量可以相互赋值。比如你定义了
struct myclass A;
struct myclass B;
可以直接写
B=A;
完成将A复制到B,不必要写
B.a=A.a;
B.b=A.b;
你可能觉得这谁到知道,但是我就曾见一个50多岁的高级工程师要求不能写第一种赋值方式,必须用第二种,认为结构变量是引用类型。(也许是我见过的太异类了;))

结构变量的值语义可以用来包装数组。前面讲过数组的名字是一个地址,地址就是引用语义。如果一个函数以一个数组做输入参数比如:
void foo(char[] bar)
{
....
}
如果函数里面修改了数组内容,也会影响函数外面的数组的内容,但是你可以将数组包装成一个结构
struct warpper ws
{
char x[20];
int length;
}
这样就是传递数组参数就称为了一个值拷贝的过程。但是显然值拷贝的工程要比引用拷贝耗时多。

union是C语言C++独有的一种机制。union类似与结构,但是它的成员尽量的共用一块内存。比如:
union{
int d;
char x;
};


这 里用的是匿名共用体。如果我对x赋值,那么我会影响d的头8位或尾8位。依赖于机器的的数据表示方式。早期union的用途是节约内存,类似Pascal 记录中的选择类型。比如,一个记录学生体育考试信息的结构,对于男学生需要引体向上的成绩,对于女学生需要仰卧起坐的成绩。这是就可以把引体向上的成绩和 仰卧起坐的成绩放在一个union中。还有有一种用途是和C语言的位域一起用来拆分位。

复习一下位域,定义结构时可以指定成员占用的位的个数比如:
struct dd{
unsigned int a:4;
unsigned int b:4;
}


这个结构只占用一个字节,a和b都只占用4bits,能表示0-16。最早估计这个特性也是为了节约内存。位域和union一起用就可以拆分字节。

比如,现在传感器传过来一个数据,其中一个字节中,第3位是我们关系的标志位。我们可以用位运算x&0x08来判断第3位是1还是0。但是有时候需要拆分的位很多,我们可以这样:
struct b{
int b0:1;
int b1:1;
int b2_7:6;
}
union{
struct b x;
char  t;
};


这样我们只要把这个字节赋值给t,就可以从x中简单的解出第0位和第1位。

最后介绍一下常量。传统的常量是用#define定义的,后来C99标准中加入了const关键字。用const定义的常量在于有类型信息,编译的时候编译器会检查常量的类型是否兼容。但是const 定义的常量是有external linkage的,要注意。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息