c语言进阶7-结构体
一、 结构体:
在程序设计基础当中我们学习了变量,变量可以节省使用空间相对于常量而言,大家来看下表:
学号 |
姓名 |
职位 |
性别 |
数学 |
英语 |
语文 |
总成绩 |
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[]; char sex[]; 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[]={ { “张三”,”男”,,}, { “李四”,”男”,,}, { “王五”,”男”,,} };
三、 结构体指针
- 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=;
printf("%d\n",a.i);
a.ch='a';
printf("%c\n",a.ch);
a.f=1.1;
printf("%f\n",a.f);
}
六、 初始化实例
在定义共用体变量时,可以同时对变量进行初始化操作。初始化的值放在一对大括号中。
注意:
对共用体变量初始化时,只需要一个初始化值就足够了,其类型必须和共用体的第一个成员的类型相一致
代码实例如下
/* Note:Your choice is C IDE */ #include "stdio.h" union data { int i; char ch; }; void main() { union data a={}; printf("%d\n",a.i); printf("%c\n",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 ;
}
int main()
{
//FILE *fp = fopen("graph.txt", "w+");
float x, y, f;
int z;
srand((unsigned)time);
for(;;){
z=rand()%+;
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/), ) - ; //函数方程
//fputc(f <= 1E-5 ? '*' : ' ', fp);
putchar(f <= 1E- ? '*' : ' ');//1E-5等价于1x10^(-5)
}
//fputc('\n', fp);
putchar('\n');
}
//fclose(fp);
Sleep();
system("cls");
}
return ;
}
c语言进阶7-结构体的更多相关文章
- GO学习-(13) Go语言基础之结构体
Go语言基础之结构体 Go语言中没有"类"的概念,也不支持"类"的继承等面向对象的概念.Go语言中通过结构体的内嵌再配合接口比面向对象具有更高的扩展性和灵活性. ...
- C语言中的结构体,结构体数组
C语言中的结构体是一个小难点,下面我们详细来讲一下:至于什么是结构体,结构体为什么会产生,我就不说了,原因很简单,但是要注意到是结构体也是连续存储的,但要注意的是结构体里面类型各异,所以必然会产生内存 ...
- Go语言基础之结构体
Go语言基础之结构体 Go语言中没有“类”的概念,也不支持“类”的继承等面向对象的概念.Go语言中通过结构体的内嵌再配合接口比面向对象具有更高的扩展性和灵活性. 类型别名和自定义类型 自定义类型 在G ...
- 4-17疑难点 c语言之【结构体对齐】
今天学习了结构体这一章节,了解到了结构体在分配内存的时候采取的是对齐的方式 例如: #include<stdio.h> struct test1 { int a; char b; shor ...
- C语言第九讲,结构体
C语言第九讲,结构体 一丶结构体的定义 在C语言中,可以使用结构体(Struct)来存放一组不同类型的数据.结构体的定义形式为: struct 结构体名{ 结构体所包含的变量或数组 }; 结构体是一种 ...
- C 语言实例 - 使用结构体(struct)
C 语言实例 - 使用结构体(struct) C 语言实例 C 语言实例 使用结构体(struct)存储学生信息. 实例 #include <stdio.h> struct student ...
- Verilog缺少一个复合数据类型,如C语言中的结构体
https://mp.weixin.qq.com/s/_9UsgUQv-MfLe8nS938cfQ Verilog中的数据类型(Data Type)是分散的,缺少一个复合数据类型:把多个wire, r ...
- go语言之进阶篇结构体指针类型匿名字段
1.结构体指针类型匿名字段 示例: package main import "fmt" type Person struct { name string //名字 sex byte ...
- C语言中的结构体
用户自己建立自己的结构体类型 1. 定义和使用结构体变量 (1).结构体的定义 C语言允许用户自己建立由不同类型数据组成的组合型的数据结构,它称为结构体. (2).声明一个结构体类型的一般形式为: ...
- [汇编与C语言关系]4. 结构体和联合体
用反汇编的方法研究一下C语言的结构体: #include <stdio.h> int main(int argc, char ** argv) { struct { char a; sho ...
随机推荐
- C# ACCESS 修改表记录提示"UPDATE 语句语法错"问题
错误的sql 语句如下: sqlStr = "update tb_userInfo set passWord='" + pw + "' where userName=' ...
- Window Features(包括Z-Order,Layered Windows, Message-Only Windows, Owned Windows, Window的状态等)
https://msdn.microsoft.com/en-us/library/windows/desktop/ms632599(v=vs.85).aspx#owned_windows https: ...
- Markdown 语法简体中文版
Markdown 语法简体中文版(fork 于繁体中文版 http://markdown.tw/ ) http://wowubuntu.com/markdownhttps://github.com/r ...
- 星星的模块封装类 IDSStarsScoreView
1 IDSStarsScoreView 的实现效果 2 类的封装方法: <声明文件> // // IDSStarsScoreView.h // Near // // ...
- orm多表操作
一.创建表 1.一对多 必须在"多"的表中创建关联字段,在外加约束 class Book(models.Model): id=models.AotuField(primary_ke ...
- 极简代理IP爬取代码——Python爬取免费代理IP
这两日又捡起了许久不碰的爬虫知识,原因是亲友在朋友圈拉人投票,点进去一看发现不用登陆或注册,觉得并不复杂,就一时技痒搞一搞,看看自己的知识都忘到啥样了. 分析一看,其实就是个post请求,需要的信息都 ...
- python列表和字典的迭代
1.列表和字典的迭代 程序开发中,对列表和字典进行迭代是非常常见的事情. 字典一般可以选择对key进行迭代.对value迭代和对key/value一起迭代 >>> d = {'a': ...
- ZooKeeper学习第三期---Zookeeper命令操作(转)
转载来源:https://www.cnblogs.com/sunddenly/p/4031881.html 一.Zookeeper的四字命令 Zookeeper支持某些特定的四字命令字母与其的交互.他 ...
- DOM模型-属性操作
HTML 元素包括标签名和若干个键值对,这个键值对就称为"属性"(attribute)."属性"本身是一个对象(Attr对象),但是实际上,这个对象极少使用.一 ...
- 全自动Landsat影像温度反演软件开发
许久没有更新遥感类软件开发了,都有点生疏了,这一次我带来了一个老的算法,新的东西, 为什么这么说呢,我们知道Landat8.Landsat5等影像,单个影像去做温度反演,并没有什么太大的难度, 但是呢 ...