目录
我们己经知道,数组可以用来表示一组相同类型 (例如 int 或 float)的数据项。但是,如果要用一个名称来表示不同类型的数据集合,就不能用数组了。幸运的是,C 语言支持一种结构化的数据类型,称为结构体(structure),它是一种封装不同类型的数据的机制。
结构体是一种用于处理一组逻辑相关的数据项的简便工具。例如,可以用来表示一个属性集,例如 student_name、roll number 和marks。结构体的概念类似于其他很多语言中的“记录”。
*结构体有助于一种有意义的方法来组织复杂数据。
与数组不同,结构体首先要先定义结构体的格式,然后再声明结构体变量
例:
struct book_bank
{
char title|20];
char author [15];
int pages;
float price;
};
//结构体定义其实就是规定了一种格式
结构体变量的声明包括以下部分:
(1)关键宇 struct。
(2)结构体标记待。
(3)由逗号分隔开的变量名列表。
(4)终止分号。
例:struct tag_name,member1,member2;
还有一种定义结构体变量的方法:
struct book_bank
{
char title|20];
char author [15];
int pages;
float price;
}book1,book2,book3;
但是这样定义变量有几个问题
(1)由于没有标记符名,就不能再用它来声明其他变量了。
(2)通常,结构体定义是出现在程序文件的开头,位于所有变量或函数定义之前。也可以出现在main 和诸如#define 之类的宏定义之前。在这些情况下,结构体定义是全局的,可以被其他函数使用。
所以这样的定义方法要慎用!
typedef int 整型 //取别名
首先要了解运算符点号“.”,用来进行成员和变之间连接
例如:book1.price
通过访问结构体成员,我们可以对结构体变量单独成员赋值
对字符串:
strcpy (book1.title,”Basic”)
scanf(“%s”,book1.title)//和一般字符串处理相同
其他:
book1.price=10
scanf(“%d”,&book1.price)
也可以用指针访问成员
- 使用间接表示法(*ptr).x//括号别忘了
- 使用选择表示法 ptr->x
struct book_bank
{
char title|20];
char author [15];
int pages;
float price;
};
struct book_bank book1={“Wise”,”Babala”,100,10};
或
struct book_bank
{
char title|20];
char author [15];
int pages;
float price;
}book1={“Wise”,”Babala”,100,10};
注意结构体成员与初始化值一一对应
C语言不允许对模板中的单个结构体成员进行初始化,必须在实际结构体变量的声明
中初始化。
但结构体允许部分初始化,可以只初始化前面的一些成员,未初始化的成员必须位于列
表的末尾,未初始化的成员将进行:对于整数和浮点数,赋给默认值零,对字符及字符串赋给默认值“\0”。
相同结构体类型的两个变量可以巷普通变量一样进行复制
例:book1=book2
但是C语言不允许对结构体变量进行任何逻辑操作
如要比较两个结构体变量我们应逐个比较结构体各个成员
我们可以声明一个结构体数组,数组每个变量表示一个结构体变量
例:struct class students[100]
初始化也就变成struct class students[3]={{1,3,4,},{2,5,4},{5,8,3}}
结构体也允许数组作为其成员
struct book_bank
{
Int a[10];
float price;
};
道理差不多,就是结构体嵌套
要把结构体的值从一个函数传递给另一个函数,有以下3种方法。
(1)把结构体的每个成员作为函数调用的实参进行传递。然后就可以像普通变量一样米处理实参。这是最基本的方法,但如果结构体很大,这种方法就变得难以控制,效率也不高。
(2)将整个结构体的副本传递给被调用函数。由于函数使用的是结构体的副本,因此,在的数中对结构体成员的任何修改不能反映到初始结构体中。因此,需要函数将整个结构体返回给调用函数。但并不是所有编译器都支持这种方法。
(3) 使用指针以参数形式来传递结构体。在这种情况下,结构体的地址传递给被调用的函数。该函数可以间接地访问整个结构体。这类似于将数组传递给函数。与第一种方法相比,这种方法更有效。//见结构体与指针
struct book_bank
{
char title|20];
char author [15];
int pages;
float price;
}book[3];
ptr=book;
这是指针就指向book[0]第一个元素,就可以用指针访问成员
(*ptr).title ptr->title
这里(*ptr)和ptr->都是book[0]的意思
ptr++表示指向下一个数组
print_ invent (struct invent *item)
printf ("'Name: %s \n", item->name) ;
printf ("Price: %f \n", item-›price);
结构体与函数方法(3)可用下面的语句来调用:
print_ invent (&product);
形参 item 接收的是结构体 product 的地址,因此它必须声明为 struct invent 类型(它表示的是product 结构体)的指针。
- 结构体大小
结构体变量大小可用sizeof来获取
例:sizeof(struct x)
共用体是从结构体中借用来的概念,因此遵循与结构体相似的语法。共用体与结构体两者之间主要的区别是存储形式。在结构体中,每个成员有自己的存储空间,而共用体中的所有成员使用相同的存储空间。这意味着,尽管共用体可以含有不同数据类型的多次成员,但一次只能处理一个成员。与结构体类似,共用体可以使用关键宇 union 来声明。
例:
uinon item
{
int m;
float x;
char c;
}code;
共用体只创建一个存储空间,每次只能被某一成员使用。当某个成员被赋予一个新值时,该新值将替代掉前一成员的值。
对共同体进行初始化,只能用与的第一个共同体成员类型相同的值进行初始化