现在的位置: 首页 > 综合 > 正文

结构体&&共用体

2013年02月03日 ⁄ 综合 ⁄ 共 1747字 ⁄ 字号 评论关闭

 结构体是一种复杂的数据类型,是数目固定,类型不同的若干有序变量的集合。

用宏定义使一个符号常量来表示一个结构类型。

例如:

#define STU struct stu  //宏定义后面没有逗号        

STU

    {

        int num;

        char name[20];

        char sex;

        float score;

    };

STU boy1,boy2;

一.结构体的变量的说明方式:

1.先定义在说明。2.在定义结构体的同时说明结构体变量。3. 直接说明结构体变量  如:struct   { int num;  char *stu} boy1,boy2;

结构体指针的使用和说明:

一个指针变量当用来指向一个结构变量时,称之为结构指针变量。结构指针变量中的值是所指向的结构变量的首地址。

二.结构指针变量说明的一般形式为:

    struct 结构名 *结构指针变量名;

如:

struct stu *pstu;

当然也可在定义stu结构时同时说明pstu。

与前面讨论的各类指针变量相同,结构指针变量也必须要先赋值后才能使用。

赋值是把结构变量的首地址赋予该指针变量,不能结构名予该指针变量。

stu  boy;

如果boy是被说明为stu类型的结构变量,则:

    pstu=&boy

是正确的,而:

    pstu=&stu

是错误的。

还有一种情况声明结构体指针不给其分配内存,必须先声明变量(才能分配内存)再把变量的地址复制给结构体指针,不然只能只是一个指针,不能引用结构体里面的成员;

在对成员进行引用的时候要注意:

例如:

(*pstu).num

或者:

    pstu->num

应该注意(*pstu)两侧的括号不可少,因为成员符“.”的优先级高于“*”。如去掉括号写作*pstu.num则等效于*(pstu.num),这样,意义就完全不对了。

三.动态存储分配

数组的长度是预先定义好的,在整个程序中固定不变,C语言中不允许动态数组类型。

例如:

int n;

    scanf("%d",&n);

int a[n];

用变量表示长度,想对数组的大小作动态说明,这是错误的。严重错误!!!!!!!记住啊!!

 

共用体

 定义:

union  共用体名

{

成员列表;

} 变量列表;

union data

{

int i;

char ch;

float f;

}  a,b,c;

   公用的占用的内存的最大长度等于最长的成员的长度;

共用体变量的引用方式:

必须先定义共用体的变量才能引用它,而且不能引用共用体变量,只能引用的是共用体变量中的成员,如

a.i; a.ch;

共用体的作用:

1.每一个瞬间只有一个成员起作用,其他的成员不起作用;

2.公用体变量中起作用的是最后一次存放的成员,再存入最后一个新的成员的时候原有的成员的就失去了作用,如:  a.i =5;a.c =‘a’; a.f = 1.5;

此时只有a.f是有效的,其他的成员是没有意义的

3.共用体的变量的地址和他的成员的地址都是同一个地址,如:&a,&a.i ,&a.c,&a.f 都是同一个地址;

4.不能对共用体变量名进行赋值,也不能企图引用变量名来得到一个值,又不能在定义共用体变量的时候对其初始化。如:union {int a; int b;} ch={5,6}

    ch = 1; m =a;都是错误的;

5.不能把共用体变量作为函数的参数,也不能使函数带回共用体变量,但是可以使用的是公用体的指针(与结构体变量的使用相仿);

共用体和结构体可以互相嵌套;

 

枚举类型:

声明是用的enum开头,如:enum weekday{sun,mon,tue,wed,thu,fri,sat}

声明之后就可以用enum weekday 定义变量;

enum weekday workday;

workday被定义成枚举变量之后就只能是sun  到sat中的一个。如:workday = sat; 

sun,mon,tue,wed,thu,fri,sat被称为枚举元素或者是枚举常量;他们只是标识符,必须的用户自己定义他们的含义;

 1枚举元素都是常量是不能赋值的   sun = 0;是错误的!!!

2.枚举元素是有值的,可以给枚举的变量赋值,如enum weekday  work = sun;

3.一个整数必须在强制转换之后才能赋值给一个枚举变量,  workday = (enum weekday )6;

抱歉!评论已关闭.