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 ...
随机推荐
- Windows完成端口编程
Windows完成端口编程目录一 基本概念二 OVERLAPPED数据结构三 完成端口的内部机制创建完成端口完成端口线程的工作原理线程间数据传递线程的安全退出 一 基本概念 设备---wi ...
- Windows 7 频繁提示:计算机的内存不足
最近由于同时打开的程序比较多,Windows 7 频繁提示:计算机的内存不足,如下图: 问题原因: 经过一番尝试,得出一个大概的结论:当虚拟内存空间的大小小于物理内存空间的大小时,一旦程序开的太多,物 ...
- ACL FAQ
acl 下载地址:https://sourceforge.net/projects/acl/https://github.com/zhengshuxin/acl/http://git.oschina. ...
- Excel导入导出各种方式分析
1.引言 1.1解决哪些问题 现在很多公司用的导出基本上采用的通过gridView导出excel,此种导出存在以下几种问题 1.数据量大的时候有时导出有时会让浏览器卡死,因为导出的excel不是真 ...
- SpringCloud-分布式配置中心【加密-非对称加密】
案例代码:https://github.com/q279583842q/springcloud-e-book 非对称加密 一.什么是非对称加密(Asymmetric encryption) 二.Jav ...
- canvas的进阶 - 学习利用canvas做一个炫酷的倒计时功能
先给大家贴一张图片,因为我不会上传视频( ̄□ ̄||) ,请大家谅解了~ 如果有知道怎么上传视频的大神还请指点指点 ^_^ ~ 然后看一下代码: html部分 : <!DOCTYPE html ...
- 解决vuejs 创建数据后设置对象的属性实现不了双向绑定问题
抛出踩坑:vue创建后的数据,自定义设置对象的属性,实现不了双向绑定 当业务场景,需要在请求接口数据新增自定义的属性 let foodList = [ {title: '回锅肉', price: 99 ...
- Python时间戳的一些使用
Python时间戳的一些使用 为什么写下这篇文档? 由于我本身是做Python爬虫的,在爬取网站的过程当中,会遇到形形色色的验证码,目前对于自己而言,可能简单的验证码可以进行自己识别 发现大多数的网站 ...
- Django之分页器组件
class Pagination(object): def __init__(self,current_page,all_count,per_page_num=2,pager_count=11): & ...
- 你的http需要“爱情”
目的是为了更白话的认识http,面对业内人,还有一些吃瓜的... 故事背景描述: 男猪脚在情人节这天给他女票发送了一条信息,"I love U",女主角收到后很开心,也回复了一条信 ...