结构体传值:
结构体也是标量,像字符和整数一样,可以传递给一个函数,但是传入整个结构体效率很低,可以传入指向结构体的指针来提高效率。如果不希望程序对结构体变量改变可以加入const关键词。
typedef struct {
int id;
int num;
char name[100];
} Produts;
//传入指针,加const修饰,防止程序修改
void test(Produts const *ptr);
位段:
结构体可以实现位段,位段的声明和结构体类型,但是成员是多个位的字段,不同长度的字段储存在一个或多个整形变量中。位段的类型必须声明成int,signed,unsigned int 类型,其次,成员名后面时一个冒号,和一个整数,整数指定位段所占位数目:
struct CHAR {
unsigned ch : 7;
unsigned font : 6;
unsigned size : 19;
};
占32位,对于16位机器来说,size超过了整型长度,所以是不可移植的。位段的长处是节省空间,和对位的操作更方便。
联合union
联合可以看成在某个位子上可以储存不同类型的值,但是只能储存一个,联合的成员引用的是内存中相同的位置,可以在不同时刻,把不同的东西存在同一个位置。
#include <stdio.h>
union {
float f;
int i;
char * str;
} var;
int main()
{
var.f = 12.3;
printf("%g\n", var.f);
var.i = 111;
printf("%d\n", var.i);
var.str = "hello";
printf("%s\n", var.str);
return 0;
}

var联合可以储存浮点数,整数和字符串指针,根据不同的类型,读取出不同的值。但是联合一次只可以储存一个值,所以在函数中使用时,无法确定所储存的类型,如果和struct一起使用可以添加一个标示代表所储存的类型。
#include <stdio.h>
//类型var可以放整数,浮点,字符串指针。
typedef struct {
enum {INT, FLOAT, STRING} type;
union {
int i;
float f;
char * str;
} value;
} var;
//根据类型读取值
void checkVar(var variable)
{
switch(variable.type){
case 0:
printf("int %d\n", variable.value.i);
break;
case 1:
printf("float %g\n", variable.value.f);
break;
case 2:
printf("string %s\n", variable.value.str);
break;
default:
printf("not valid type");
break;
}
}
int main()
{
var variable1;
variable1.type = 0;
variable1.value.i = 11;
checkVar(variable1);
variable1.type = 1;
variable1.value.f = 11.11;
checkVar(variable1);
variable1.type = 2;
variable1.value.str = "yangxunwu";
checkVar(variable1);
return 0;
}
注意:联合的初始化值必须时第一个成员类型,如果是其他类型,那么会发生类型转换成为一个整数。
原文:http://www.cnblogs.com/yangxunwu1992/p/5831860.html