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 ...
随机推荐
- Qt - 设置程序界面风格(现成的QMacStyle等等)
类的继承关系: QMotifStyle:OSF(开放基金协会)开发的一个工业标准的GUI(图形用户接口): QCDEStyle:公共桌面环境(Common Desktop Environment)的缩 ...
- 高并发 Nginx+Lua OpenResty系列(10)——商品详情页
本章以京东商品详情页为例,京东商品详情页虽然仅是单个页面,但是其数据聚合源是非常多的,除了一些实时性要求比较高的如价格.库存.服务支持等通过AJAX异步加载加载之外,其他的数据都是在后端做数据聚合然后 ...
- SQLAlchemy基本使用,创建表,增删改查
基础语法 创建连接 from sqlalchemy import create_engine # 写法1 engine = create_engine("postgresql://scott ...
- spring cloud 系列第2篇 —— eureka 高可用注册中心的搭建 (F版本)
源码仓库地址:https://github.com/heibaiying/spring-samples-for-all 一.项目结构 eureka-server为服务注册中心,负责服务的管理: eur ...
- spring源码深度解析— IOC 之 默认标签解析(上)
概述 接前两篇文章 spring源码深度解析—Spring的整体架构和环境搭建 和 spring源码深度解析— IOC 之 容器的基本实现 本文主要研究Spring标签的解析,Spring的标签 ...
- ASP.NET Core MVC 之路由(Routing)
ASP.NET Core MVC 路由是建立在ASP.NET Core 路由的,一项强大的URL映射组件,它可以构建具有理解和搜索网址的应用程序.这使得我们可以自定义应用程序的URL命名形式,使得它 ...
- laravel-admin(自定义表单视图)
前言: 在上一遍文章(https://www.cnblogs.com/shiwenhu/p/10271013.html)中写到可以使用自定义form组建来创建表单,几乎能满足我们大部分要求,而且不用我 ...
- idea上MyBatis第一个例子
接着上面创建的maven项目来. 1.java目录下创建cn.happy.entity包 2.idea下创建数据库连接 配置连接参数 3.把数据库表变成实体类 导入成功,改一下包名就可以用了 4.新建 ...
- 向Rocket.Chat推送消息
Rocket.Chat推送消息 Rocket.Chat是一个开源实时通讯平台, 支持Windows, Mac OS, Linux. 支持聊天, 文件上传, 视频通话, 语音通话功能. 向Rocket. ...
- kubernetes实战篇之helm示例yaml文件文件详细介绍
系列目录 前面完整示例里,我们主要讲解helm打包,部署,升级,回退等功能,关于这里面的文件只是简单介绍,这一节我们详细介绍一下这里面的文件,以方便我们参照创建自己的helm chart. Helm ...