C语言基础之结构体和共用体

来源:互联网 发布:查询树形 mysql 编辑:程序博客网 时间:2024/05/29 15:09

                                                 结构体类型与共用体

结构体类型定义

“结构”是一种构造类型,他由若干个成员组成,每一个成员可以是基本数据类型或者又是一个构造类型


定义一个结构体的一般形式为

struct 结构名

{成员列表};

每个成员定义为:

数据类型名 结构体成员名;

例:struct student

{

int num;

char name[20];

char sex;

int age;

float score;

};


注意:

1.当一个结构体定义在函数之外时,它具有全局作用域,若定义在任一队花括号之内时,具有局部作用域。

2.类型定义语句属于非执行语句,只在程序编译阶段处理它,并不在编译后生成的目标程序中存在对应的可执行目标代码;

3.定义一个结构体类型,系统并不分配一段内存单元存放个数据项成员。一个结构体类型的长度是其所有项长度之和。


例:输入并显示学生信息

#include <stdio.h>

struct student

{

int num;

char name[20];

char sex;

int age;

float score;

};

main()

{

struct student stu1;   //定义结构体变量stu1

char ch;

float x;

printf("Please inout student's information:\n");

printf("num name age sex score\n");

scanf("%d",&stu.num);

scanf("%d",&stu.name);

scanf("%d",&stu.age);

ch=getchar();

scanf("%c",&stu.sex);

scanf("%f",&x);

student.score=x;

printf("num=%3d\nname=%s\nsex=%c\nage=%3d\nscore=%4.2f\n",stu.num,stu.name,stu.sex,stu.age,stu.score);

}


也可以多个student结构体变量如下:

struct student stu1,stu2;


也可以写成:

struct 结构名

{

成员列表;

}变量名列表;


或直接说明结构体变量

struct

{

成员列表;

}变量名列表;


结构体变量初始化

struct studengt student1={20100102,"xiaoming",'M',19,90.5}


结构体数组的定义与初始化

struct user_info user[3];

结构体数组元素成员的访问形式:

结构体数据名[元素下标].结构体成员名


结构体作为函数参数

1.把一个完整的结构体变量作为参数传递;

2.用结构变量的成员作为参数;

3.用指向结构变量(或数组)的指针作实参,将结构体(或数组)的地址传递给形参


返回值为结构体类型的函数

struct student stu[3];

for(i=0;i<3;i++)

stu[i]=input_info();


struct student input_info() //定义学生信息输入函数

{

struct student stu;

scanf("%d",&stu.num);

scanf("%d",&stu.name);

scanf("%d",&stu.sex);

scanf("%d",&stu.age);

for(j=0;j<2;j++)

scanf("%f",&stu.score[j]);

return(stu);

}


共用体类型的定义

将几种不同数据类型共同存放在一段起始地址相同的连续的存储空间中。共用体重的数据是相互覆盖的关系,几种不同类型

的数据共同存放在有单起始地址相同的连续的存储空间中,但某个时刻只能存储其中的一种数据。

共用体变量的定义

1.间接定义,先声明类型,在定义变量

例: union data un1,un2,un3;

2.直接定义-定义类型的同时定义变量

例:union data

{

int i;

char ch;

float f;

}un1,un2,un3

3.省略共用体(匿名),直接定义变量

:union

{

int i;

char ch;

float f;

}un1,un2,un3

注意:共用体变量所占内存等于最长成员的长度。

共用体变量的引用

共用体变量名.成员名

例:un1.i



枚举类型

枚举类型是一种基本数据类型,枚举生命可以显式地声明byte,sbyte,short,int,long类型作为对应的基础类型,没有显式地声明基础类型的枚举

声明意味着所对应的基础类型是int.

枚举类型定义

enum 枚举类型名{标识符1,标识符2,…,标识符n};

例:enum weekday{sun,mon,tue,wed,thu,fri,sat};

       enum weekday day;

变量day是枚举类型enum weekday,它的值可能是 sun,mon,,,,等中的某一个

如下的赋值是合法的:

day=sun;


注意:

1.枚举元素作为常量是有值的,例上的sun的值为0,mon的值为2等

如果在定义枚举类型时指定元素的值也是可以改变枚举元素的值的,例:

enum weekday{sun=7,mon=1,tue,wed,thu,fri,sat};

2.枚举元素是常量,是整数值,而非字符串,所以不能对它赋值

3.一个整数不能直接赋给一个枚举变量,必须进行强制转换才能赋值

例: day=(enum weekday)2;

这个赋值的意思是将顺序为2的枚举元素赋给day。


                                                  typedef语句

typedef声明,为现有类型创建一个新的名字,也就是说允许用户为数据类型取“别名”。typedef能隐藏笨拙的语法结构以及

平台相关的数据类型,从而增强可移植性和课维护性。用typedef定义数组,指针,结构等类型将带来很大的方便,不仅使

程序书写简单而且使意义明确,因而增强了可读性

tyoedef语句形式

typedef 现有类型名 新类型名;

1.说明一个等价的数据类型

例    typedef int INTERGER;

则程序中的 INTRGER x;  等价为 int x;

2.定义一个新的类型名代替数组

typedef char NAME[20];

表示name是字符数组类型,长度为20,然后可以用NAME说明变量,如:

 NAME a1,a2,s1,s2;

完全等效于  char a1[20],a2[20],s1[20],s2[20];

3.定义一个新的类型名代替一个结构体类型

例: typedef struct

{

int month;

int day;

int year;

}DATE;

DATE birthday, *p;

将结构体定义为一个新的类型名DATE,在程序中可以使用DATE定义结构变量或者指针。

4.定义一个新的类型名代替指针类型

typedef char*STRING;

STRING p1,p2,p[20];

定义STRING为字符指针类型,p1,p2为字符指针变量,p为字符指针数组。

说明:

1.typedef没有创造新的数据类型,是对现有类型名的补充别名,并不取代它,因此现有的类型名依然有效

2.typedef定义类型,不能定义变量;

3.新类型名一般用大写字母表示。