结构体传值:函数
结构体也是标量,像字符和整数同样,能够传递给一个函数,可是传入整个结构体效率很低,能够传入指向结构体的指针来提升效率。若是不但愿程序对结构体变量改变能够加入const关键词。spa
typedef struct { int id; int num; char name[100]; } Produts; //传入指针,加const修饰,防止程序修改 void test(Produts const *ptr);
位段:指针
结构体能够实现位段,位段的声明和结构体类型,可是成员是多个位的字段,不一样长度的字段储存在一个或多个整形变量中。位段的类型必须声明成int,signed,unsigned int 类型,其次,成员名后面时一个冒号,和一个整数,整数指定位段所占位数目:blog
struct CHAR { unsigned ch : 7; unsigned font : 6; unsigned size : 19; };
占32位,对于16位机器来讲,size超过了整型长度,因此是不可移植的。位段的长处是节省空间,和对位的操做更方便。内存
联合union字符串
联合能够当作在某个位子上能够储存不一样类型的值,可是只能储存一个,联合的成员引用的是内存中相同的位置,能够在不一样时刻,把不一样的东西存在同一个位置。string
#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一块儿使用能够添加一个标示表明所储存的类型。it
#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; }
注意:联合的初始化值必须时第一个成员类型,若是是其余类型,那么会发生类型转换成为一个整数。io