一、 结构体:
在程序设计基础当中我们学习了变量,变量可以节省使用空间相对于常量而言,大家来看下表:
学号 |
姓名 |
职位 |
性别 |
数学 |
英语 |
语文 |
总成绩 |
1 |
刘琳 |
班委 |
女 |
50 |
61 |
56 |
167 |
2 |
张华 |
班委 |
男 |
60 |
60 |
54 |
174 |
3 |
张三 |
学生 |
男 |
66 |
62 |
52 |
180 |
4 |
陈露 |
班委 |
男 |
93 |
54 |
62 |
209 |
5 |
李明 |
班委 |
女 |
56 |
45 |
88 |
189 |
6 |
李讲 |
班委 |
女 |
99 |
56 |
65 |
220 |
如果让你把表中所要输入的数据,每个数据都用变量来输入的话,那么我们就要定义多个变量,多个变量使用过程中比较散乱,那么有什么更好的办法来做这件事呢?这就像excel表格一样,只要有了上面的字段名,分别填写数据就行,那么C语言中就提供了一种构造类型:结构体,它可以很方便的构造出一个类型,这个类型是由多个变量(字段)组成的。
- 1. 结构体的概念
结构体:高级语言的一种构造类型。在程序的开发过程中使用还是比较广泛的。
- 2. 结构体变量的定义
(1) 结构体定义的一般格式:
struct 结构体名
{
类型 成员变量1;
类型 成员变量2;
….
类型 成员变量n;
};
注:结构体最后的分号不能省略
例如我们定义学生结构体:
struct student { char name[20]; char sex[10]; int age; int score; };
结构体可以像宏一样定义在函数外部,作全局变量来用。也可以定义在函数内部作为局部变量来用。
(2) 结构体变量的定义格式:
struct 结构名 变量名;
例如根据上面定义的学生结构体
struct student stu;
操作实例如下:
- 3. 结构体变量的引用
结构体变量的引用,实际是引用其各个成员,要使用.或者->
普通变量使用 . 如上图中的s.name s.sex s.age s.score
指针变量使用 –> 如上四个也可能改为s->name s->sex s->age s->score
- 4. 结构体类型的初始化
初始化格式:
struct 结构名 变量名={值1,值2,….};
例:struct student stu={“张三”,”男”,18,100};
二、 结构体数组
- 1. 定义结构体数组
定义格式:struct 结构名 数组名[常量表达式];
例如学生结构体数组定义
struct student stu[20];
- 2. 初始化结构体数组
初始化结构体数组格式:
struct 结构名 数组名[常量表达式]={
{值1,值2,….},
……
{值1,值2,….}
};
struct student stu[3]={ { “张三”,”男”,18,100}, { “李四”,”男”,19,90}, { “王五”,”男”,23,97} };
三、 结构体指针
- 1. 指向结构体变量的指针
定义结构体类型的指针变量格式:
struct 结构名 *指针变量名;
例如学生结构体,定义指针变量s指向学生结构体类型
struct student *s;
第一种赋值方式:
struct ss { int a; int b; int c; }s; struct ss *p=&s;
第二种赋值方式:
struct ss { int a; int b; int c; }s; struct ss *p; p=&s;
- 2. 指向结构体数组的指针
当定义好结构体数组之后,可以用指针指向,便于移动指针,访问数组的不同位置的元素。
例如:
struct student stu[20],*p;
p=stu; //p指针指向stu数组的第一个元素
可以通过p++的方式移动指针,指向后面的元素。
- 3. 结构体作为函数参数
参数可以结构体类型的变量、结构体数组
当时结构体数组时候,传递的是数组的首地址,是地址传递.
四、 共用体的概念
当需要把不同类型的变量存放到同一段内存单元或对同一段内存单元的数据按不同类型处理则需要使用共用体数据结构,共用体也称为联合体。
例把一个整型变量一个字符型变量一个实型变量放在同一个地址开始的内存单元中
共用体的定义形式
union 共用体名
{
成员列表
}变量列表;
例如定义一个共用体,包括的数据成员有整型、字符型和实型。
union data { int i; char ch; float f; }a;
其中a为定义的共用体变量,而union data是共用体类型,还可以像结构体那样将类型的声明和变量定义分开;
union data a;
可以看到共用体其实和结构体类似,但是一定要注意区分:
共用体各成员占相同的起始地址所占内存长度等于最长的成员所占内存
结构体各成员占不同的地址所占内存长度等于全部成员所占内存之和
五、 共用体变量的引用
共用体变量定义完成后,就可以引用其中的成员数据进行使用,引用的一般形式为:
共用体变量.成员名;
只能引用共用体变量的成员如下
union data a;
a.i;
a.ch;
a.f;
代码参考:
/* Note:Your choice is C IDE */ #include "stdio.h" union data { int i; char ch; float f; }a; void main() { union data a; a.i=3; printf("%d ",a.i); a.ch='a'; printf("%c ",a.ch); a.f=1.1; printf("%f ",a.f); }
六、 初始化实例
在定义共用体变量时,可以同时对变量进行初始化操作。初始化的值放在一对大括号中。
注意:
对共用体变量初始化时,只需要一个初始化值就足够了,其类型必须和共用体的第一个成员的类型相一致
代码实例如下
/* Note:Your choice is C IDE */ #include "stdio.h" union data { int i; char ch; }; void main() { union data a={97}; printf("%d ",a.i); printf("%c ",a.ch); }
七、 共用体类型数据的特点
共用体变量中的值是最后一次存放的成员的值如
a.i = 1;
a.ch = 'a';
a.f = 1.5;
完成以上三个赋值语句后共用体边量的值是 1.5而 a.i=1 和 a.ch='a'已无意义
共用体变量不能初始化例
union data
{
int i;
char ch;
float f;
}a={1,'a', 1.5} 错误!!!
共用体常用来节省内存,特别是一些嵌入式编程,内存是非常宝贵的!
共用体也常用于操作系统数据结构或硬件数据结构!
union在操作系统底层的代码中用的比较多,因为它在内存共赏布局上方便且直观。所以网络编程,协议分析,内核代码上有一些用到union都比较好懂,简化了设计。
八、 共用体类型的注意事项
在使用共用体类型时,需要注意以下特点
1. 同一个内存段可以用来存放几种不同类型的成员,但是每一次只能存放其中一种,而不是同时存放所有的类型。也就说在共用体中,只有一个成员起作用,其他成员不起作用。
2. 共用体变量中起作用的成员是最后一次存入的成员,在存入一个新的成员后原有的成员就失去作用
3. 共用体变量的地址和它的各成员的地址是一样的
4. 不能对共用体变量名赋值,也不能企图引用变量名来得到一个值。
弹跳球代码
#include <stdio.h> #include <math.h> #include <windows.h> #include "time.h" int color(int c) { SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),c); return 0; } int main() { //FILE *fp = fopen("graph.txt", "w+"); float x, y, f; int z; srand((unsigned)time); for(;;){ z=rand()%15+1; color(z); for(y = 1.6; y >= -1.6; y -= 0.15){ for(x = -1.1; x <= 1.1; x += 0.05){ f = x*x + pow(y - pow(x*x, 1.0/3), 2) - 1; //函数方程 //fputc(f <= 1E-5 ? '*' : ' ', fp); putchar(f <= 1E-5 ? '*' : ' ');//1E-5等价于1x10^(-5) } //fputc(' ', fp); putchar(' '); } //fclose(fp); Sleep(100); system("cls"); } return 0; }