我的C实践(2):联合的妙用
在C语言中,联合类型是一种比较特殊的类型,其多个成员共享一个存储区(为最大成员的长度),一次只能包含一个成员值,会进行内存对齐。对联合类型进行sizeof运算会包括所有成员所需要的存储空间量,还包括成员间和成员后面的填充空间。联合类似于其他语言中的“变体记录”,如果联合的长度很大或者有大量的联合,则可以大大节省存储空间。
1、联合只能一次赋值一个成员,并使用它,但C语言没有提供查询联合上一次赋值所用成员的方法。我们可以定义一个enum,其中各个枚举常量代表union各个成员的标志。然后把union和这个enum封装在一个struct中,当对union的某个成员赋值时,就设置相应的标志,这样就可以跟踪联合的成员赋值。
/* widget.c:用枚举常量来跟踪联合类型的成员赋值 */
#include <stdio.h>
#include <string.h>
enum widget_tag{ /* 联合的各个成员的标志 */
count_widget,
value_widget,
name_widget
};
struct WIDGET{ /* 把union和enum封装在一个struct中 */
enum widget_tag tag;
union{
long count;
double value;
char name[10];
} data;
} x;
typedef struct WIDGET widget;
/* 调用本函数就可以不必考虑联合的上一次赋值所用成员 */
void print_widget(widget w){
switch(w.tag){
case count_widget:
printf("Count: %ld\n",w.data.count);
break;
case value_widget:
printf("Value: %.15f\n",w.data.value);
break;
case name_widget:
printf("Name: \"%s\"\n",w.data.name);
break;
}
}
int main(){
x.tag=count_widget; /* 要给成员count赋值,设置其标志 */
x.data.count=10000;
print_widget(x); /* 会自动打印该成员的值 */
x.tag=value_widget;
x.data.value=3.14159265358979323846;
print_widget(x);
x.tag=name_widget;
strncpy(x.data.name,"Millard",10);
print_widget(x);
return 0;
}
2、如果引用联合的某一个成员,但联合上一次赋值的不是该成员,则是以不可移植的方式使用联合。我们可以利用这个方法来了解计算机内部的一些底层数据表示方法。例如要发现浮点数是如何表示的:
#include <stdio.h>
/* 用联合类型来获取浮点数的底层表示 */
void prin
相关文档:
好久以前做的一个程序,贪心策略实现背包问题,c实现。
总结在这里,以备以后和别人查找。
//背包问题
#include "stdio.h"
#define MAX 10
void main()
{
int w[MAX]={0,10,130,15,60,25}; //存放质量
int v[MAX]={0,30,5,10,20,25}; //存放价值
flo ......
http://en.wikipedia.org/wiki/C_preprocessor
C preprocessor
from Wikipedia, the free encyclopedia
Jump to:navigation, search
The C preprocessor (cpp) is the preprocessor for the C programming language. In many C implementations, it is a separate program invoked by the compiler as the first part ......
例) 危険なコーディング
1 char cStr[256];
2 ZeroMemory(cStr, sizeof(cStr));
3 &nb ......
PHP取得成功的一个主要原因之一是她拥有大量的可用扩展。web开发者无论有何种需求,这种需求最有可能在PHP发行包里找到。PHP发行包包括支持各种数据库,图形文件格式,压缩,XML技术扩展在内的许多扩展。
扩展API的引入使PHP取得了巨大的进展,扩展API机制使PHP开发社区很容易的开发出几十种扩展。。扩展主要的思想是 ......
这三章主要讲了C语言的链接、库函数、预处理。还是有点晦涩难懂啊。
一个C程序是可以有多个部分组成的,但是编译器每次只能编译一个文件,找出其中的错误。某些C语言实现提供了一个称为lint的程序,可以捕获大量的此类错误。连接器一般是与编译器分离的,编译器是把C程序“翻译”成对连 ......