一、  结构体:

在程序设计基础当中我们学习了变量,变量可以节省使用空间相对于常量而言,大家来看下表:

学号

姓名

职位

性别

数学

英语

语文

总成绩

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. 1.        结构体的概念

结构体:高级语言的一种构造类型。在程序的开发过程中使用还是比较广泛的。

  1. 2.        结构体变量的定义

(1) 结构体定义的一般格式:

struct  结构体名

{

类型   成员变量1;

类型   成员变量2;

….

类型   成员变量n;

};

注:结构体最后的分号不能省略

例如我们定义学生结构体:

     struct student

{

            char name[];

            char sex[];

            int age;

            int score;

};

结构体可以像宏一样定义在函数外部,作全局变量来用。也可以定义在函数内部作为局部变量来用。

(2) 结构体变量的定义格式:

struct 结构名 变量名;

例如根据上面定义的学生结构体

struct student stu;

操作实例如下:

  1. 3.        结构体变量的引用

结构体变量的引用,实际是引用其各个成员,要使用.或者->

普通变量使用 .     如上图中的s.name   s.sex   s.age   s.score

指针变量使用 –>   如上四个也可能改为s->name    s->sex   s->age   s->score

  1. 4.        结构体类型的初始化

初始化格式:

struct 结构名 变量名={值1,值2,….};

例:struct student stu={“张三”,”男”,18,100};

二、  结构体数组

  1. 1.        定义结构体数组

定义格式:struct 结构名 数组名[常量表达式];

例如学生结构体数组定义

struct student stu[20];

  1. 2.        初始化结构体数组

初始化结构体数组格式:

struct 结构名 数组名[常量表达式]={

{值1,值2,….},

……

{值1,值2,….}

};

 struct student stu[]={

{ “张三”,”男”,,},

{ “李四”,”男”,,},

{ “王五”,”男”,,}

};

三、  结构体指针

  1. 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;
  1. 2.        指向结构体数组的指针

当定义好结构体数组之后,可以用指针指向,便于移动指针,访问数组的不同位置的元素。

例如:

struct student stu[20],*p;

p=stu;   //p指针指向stu数组的第一个元素

可以通过p++的方式移动指针,指向后面的元素。

  1. 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-结构体的更多相关文章

  1. GO学习-(13) Go语言基础之结构体

    Go语言基础之结构体 Go语言中没有"类"的概念,也不支持"类"的继承等面向对象的概念.Go语言中通过结构体的内嵌再配合接口比面向对象具有更高的扩展性和灵活性. ...

  2. C语言中的结构体,结构体数组

    C语言中的结构体是一个小难点,下面我们详细来讲一下:至于什么是结构体,结构体为什么会产生,我就不说了,原因很简单,但是要注意到是结构体也是连续存储的,但要注意的是结构体里面类型各异,所以必然会产生内存 ...

  3. Go语言基础之结构体

    Go语言基础之结构体 Go语言中没有“类”的概念,也不支持“类”的继承等面向对象的概念.Go语言中通过结构体的内嵌再配合接口比面向对象具有更高的扩展性和灵活性. 类型别名和自定义类型 自定义类型 在G ...

  4. 4-17疑难点 c语言之【结构体对齐】

    今天学习了结构体这一章节,了解到了结构体在分配内存的时候采取的是对齐的方式 例如: #include<stdio.h> struct test1 { int a; char b; shor ...

  5. C语言第九讲,结构体

    C语言第九讲,结构体 一丶结构体的定义 在C语言中,可以使用结构体(Struct)来存放一组不同类型的数据.结构体的定义形式为: struct 结构体名{ 结构体所包含的变量或数组 }; 结构体是一种 ...

  6. C 语言实例 - 使用结构体(struct)

    C 语言实例 - 使用结构体(struct) C 语言实例 C 语言实例 使用结构体(struct)存储学生信息. 实例 #include <stdio.h> struct student ...

  7. Verilog缺少一个复合数据类型,如C语言中的结构体

    https://mp.weixin.qq.com/s/_9UsgUQv-MfLe8nS938cfQ Verilog中的数据类型(Data Type)是分散的,缺少一个复合数据类型:把多个wire, r ...

  8. go语言之进阶篇结构体指针类型匿名字段

    1.结构体指针类型匿名字段 示例: package main import "fmt" type Person struct { name string //名字 sex byte ...

  9. C语言中的结构体

    用户自己建立自己的结构体类型 1.  定义和使用结构体变量 (1).结构体的定义 C语言允许用户自己建立由不同类型数据组成的组合型的数据结构,它称为结构体. (2).声明一个结构体类型的一般形式为: ...

  10. [汇编与C语言关系]4. 结构体和联合体

    用反汇编的方法研究一下C语言的结构体: #include <stdio.h> int main(int argc, char ** argv) { struct { char a; sho ...

随机推荐

  1. QT5---应用程序发布(使用windeployqt和NSIS)

      采用动态编译的方式发布程序,即release版本. 找齐动态依赖库(.dll) 方法一   用Dependency Walker这个工具去找少了那些dll,不过这个工具也不怎么靠谱,一个比较靠谱但 ...

  2. Laravel5.x的php artisan migrate数据库迁移创建操作报错SQLSTATE[42000]解决

    Laravel5.x运行迁移命令创建数据表:php artisan migrate报错. Illuminate\Database\QueryException  : SQLSTATE[42000]: ...

  3. CodeSmith使用SQLite Provider找不到请求的 .Net Framework 数据提供程序

    关于CodeSmith5使用SQLite Provider时的报错:System.BadImageFormatException: 未能加载文件或程序集“System.Data.SQLite,.... ...

  4. ChannelPipeline----贯穿io事件处理的大动脉

    ChannelPipeline贯穿io事件处理的大动脉 上一篇,我们分析了NioEventLoop及其相关类的主干逻辑代码,我们知道netty采用线程封闭的方式来避免多线程之间的资源竞争,最大限度地减 ...

  5. MSVBVM60.dll中函数

    本文转载!!! 原文作者:飘云(飘云阁安全论坛) 原文地址:http://www.chinapyg.com/forum.php?mod=viewthread&tid=2225&high ...

  6. Android开发需要了解的 IM 知识

    引言 即便在通讯如此发达的今天,IM 也依然是诸多场景下非常重要的基础能力.因此做为 一名 Android 开发,不可避免的会遇到一些IM 相关的需求或问题.本文以一个Android开发的角度来讲述I ...

  7. orale数据库to_char时间中英文转换

    一.显示中文星期天 select to_char(sysdate,'day','NLS_DATE_LANGUAGE=''SIMPLIFIED CHINESE''') from dual; 二.显示英文 ...

  8. 如何做一个大数据seo人员

    作为流量运营者或者SEO人员,对于所从事行业领域的认识往往建立在一种直觉之上,我们很难对一个行业有一个全面的了解,这个行业领域有多宽,流量聚焦在哪里,那些是用户最关心的问题? 有的时候很难准确的把握, ...

  9. vue的懒加载如何实现?

    个人通过查找发现一个比较好用的模块,vue-lazyload 第一步 下载安装这个包    npm install vue-lazyload 第二步 在main.js中引入这个模块 import Vu ...

  10. usb口打印机的指令打印和驱动打印

    打印机简介:是计算机的输出设备之一,用于将计算机处理结果打印在相关介质上. 打印机类型:激光打印机.喷墨打印机.针式打印机.热敏打印机等. 计算机和打印机之间的连接方式:usb口.串口.并口.网口.蓝 ...