非典型性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类似与结构,但是它的成员尽量的共用一块内存。比如:
这 里用的是匿名共用体。如果我对x赋值,那么我会影响d的头8位或尾8位。依赖于机器的的数据表示方式。早期union的用途是节约内存,类似Pascal 记录中的选择类型。比如,一个记录学生体育考试信息的结构,对于男学生需要引体向上的成绩,对于女学生需要仰卧起坐的成绩。这是就可以把引体向上的成绩和 仰卧起坐的成绩放在一个union中。还有有一种用途是和C语言的位域一起用来拆分位。
复习一下位域,定义结构时可以指定成员占用的位的个数比如:
这个结构只占用一个字节,a和b都只占用4bits,能表示0-16。最早估计这个特性也是为了节约内存。位域和union一起用就可以拆分字节。
比如,现在传感器传过来一个数据,其中一个字节中,第3位是我们关系的标志位。我们可以用位运算x&0x08来判断第3位是1还是0。但是有时候需要拆分的位很多,我们可以这样:
这样我们只要把这个字节赋值给t,就可以从x中简单的解出第0位和第1位。
最后介绍一下常量。传统的常量是用#define定义的,后来C99标准中加入了const关键字。用const定义的常量在于有类型信息,编译的时候编译器会检查常量的类型是否兼容。但是const 定义的常量是有external linkage的,要注意。
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的,要注意。
相关文章推荐
- C语言结构、共用体、Typedef
- c语言教程 第九章 结构与联合
- MySQL心得6-1--MySQL语言结构--常量、变量
- 非典型性C语言教程-1.0 翻译单元,标识符,内部连接,外部连接
- 语言基础(项目结构、数据类型、变量、常量)
- c语言基础1—编译链接、整型、枚举、常量、预处理、typedef
- Virtools脚本语言(VSL)教程 - 结构
- 数据结构教程(java语言描述)徐孝凯主编----复习摘要01
- 宏(#define)和类型别名(typedef)在结构和共用体(联合体)类型定义中的应用
- 非典型性C语言教程- 0.4 连接
- PHP变量常量语言结构大小写敏感与…
- 非典型性C语言教程-1.1 变量
- 易语言基础教程之循环程序结构
- C程序语言教程二(变量、常量等)
- MySQL心得6-1--MySQL语言结构--常量、变量
- 非典型性C语言教程- x.1 VC8的使用
- 非典型性C语言教程-1.4 指针,字符串,数组
- 非典型性C语言教程-0
- 非典型性C语言教程2.1.1 读取文本文件
- 非典型性C语言教程- x.2 NetBeans+ C/C++ pack