结构体函数位域

来源:互联网 发布:怎么查看淘宝账号等级 编辑:程序博客网 时间:2024/05/21 19:31

结构体可以说是我们编程常用的一种数据结构,在嵌入式开发中也是备受青睐。首先说一下为什么大家使用结构体,当所要描述事物具有多个特征并且特征之间是不同数据类型时,可以利用结构体来进行封装。要注意在结构体中不能定义函数。在这里提到了函数,就简单介绍一下何为函数,函数是实现每一特功能的代码。函数的组成有:返回值类型、函数名、参数列表和函数体。在函数内定义的临时变量只在函数内有效,跳出函数后变量的内存会被回收,如果想将函数内的改变影响实参,可将变量地址作为实参进行传递,或利用全局变量来进行操作。函数的名字就代表了函数的入口地址。下面举一个小的例子来介绍函数,此例子的功能是交换两个变量的值:

void swap(int a,int b)//a、b为形参;void为返回值类型;swap为函数名

{

int temp;//中间变量

temp=a;

a=b;

b=temp;

printf("交换结果:%d-%d",a,b);

}//函数的作用域,当函数调用结束时,变量的内存被回收

但在主函数中调用此函数并不会真正的交换,因为函数调用为单向值传递,形参不能改变实参,如果想要改变则可以利用地址来实现:

void swap(int *a,int *b)

{

int temp;

temp=*a;

*a=*b;

*b=temp;

printf("交换结果:%d-%d",*a,*b);

}

接下来我们接着讲结构体,结构体以关键字struct开始,定义形式如下:

struct s

{

int a[10];

char name[20];

double y;

};

注意分号不可省略,首先我们计算一下结构体的容量,结构体所占内存大小为所有元素的和,即结构体s占的内存为68字节;如何定义结构体变量呢?一共分为两种方式,一种为在定义结构体时直接声明eg:

struct s

{

int a[10];

char name[20];

double y;

}stu,student[10];//stu为结构体变量,student为结构体数组

另一种定义结构体变量的方式为,在使用时在定义,即结构体形式已经事先定义过了。eg:s stu,student[3];在使用时有时不想为所定义的结构体起名字,这时隐式结构体定义就登场了,但这种定义形式必须直接定义变量。eg:

struct

{

int a[10];

char name[20];

double y;

}stu,student[10];//stu为结构体变量,student为结构体数组

讲过结构体变量的定义就来讲一下结构体变量的引用和赋值,首先不得不说结构体变量的一个方便之处,结构体变量之间允许直接赋值。结构成员的引用可以利用.或->来实现,eg:stu.y=10;等价于stu->y=10;结构体变量可以在定义是直接初始化,eg:s stu={0,1,2,3,4,5,6,7,8,9,a,b};初始化可以不全部给出,但必须从左到右依次初始化,中间不允许跳过元素。如果害怕初始化时出错,可以指定初始化元素,eg:

struct s

{

double x,y;

};

s f={f.y=10,f.x=2};

结构体是允许嵌套定义的,eg:

struct new

{

struct s

{

double x,y;

};

char name[20];

}rise={{1,2},q,w,e};

开发嵌入式的学者可能会常用到位域的概念,位域是指占一个字节的位置,一个字节有八个位,如果只用来表示真假两种状态不免浪费,这时结构体就凸显出了至关重要的作用,注意使用无符号位来定义位域,因为如果使用有符号来定义时,一个位只能表示-1或0两种状态。位域的定义如下:

typdef struct

{

unsigned  a:2;

unsigned b:4;

unsigned :0

unsigned c:6;

}WEIYU;

a与b占同一个字节,a占2位,b占4位,此字节中还剩2个字节,而c要占六个字节,这时c要从新的字节开始占位,如果c只占一个字节但又想从新的地址开始怎么办?unsigned :0;就有意义了,此语句的作用为将上一字节的剩余为空出,从下下一字节开始分配。位域变量的引用与结构体变量相同,这里就不在赘述。

1 1