结构体

首先明确,结构体是一种构造的数据类型,是一种由多个数据类型如 int,char,double,数组或者结构体......组成的类型,现在告诉大家如何定义一个结构体。在定义int整型变量时,大家肯定都知道 int a;   即定义了一个int 型变量,系统会自动分配 存int这么大的空间,但是对于结构体而言,它是由许多个不确定的类型组成的,所以在定义它的时候需要指明它是由哪些数据类型组成的.定义格式有多种,此处只说一种较为简单的,定义格式如下.

struct 名字
{
由哪些数据类型组成
};//注意末尾的分号一定要有

例如:我要定义一个学生,学生需要值得注意的属性都有什么呢? 假设需要统计这名学生的 1学号,2姓名,3性别,4班级,5电话,6期末成绩,此时为了简洁且处理方便,就需要用到结构体

struct student //结构体名
{
long long number,tel; // 学号和电话
int score; //成绩
char name[],sex[],clas[]; //姓名,性别和班级
};

如上,就成功定义了一个关于学生信息的结构体,下面实现具体的输入输出操作

#include<stdio.h>
struct student
{
long long number,tel; // 学号和电话
int score; //成绩
char name[],sex[],clas[]; //姓名,性别和班级
}; int main()
{
struct student tiantian; //声明了一个名为tiantian的变量,声明可以与定义同时进行
//现在可以输入
scanf("%lld%s%s%s%lld%d",&tiantian.number,tiantian.name,tiantian.sex,tiantian.clas,&tiantian.tel,&tiantian.score);
//输出
printf("%lld %s %s %s %lld %d",tiantian.number,tiantian.name,tiantian.sex,tiantian.clas,tiantian.tel,tiantian.score);
return ;
}

运行结果:

或许在看了上面的之后,你会想,这也太麻烦了吧,我随便定义6个独立的变量,把它输入再输出出来,这样效果是一样的,而且代码也会简洁很多,不用在用每个变量时都再前面加上声明结构体时声明的变量。对于上面这个这样想当然没错,不过我现在要说,请统计一下全班所有的人他们各自的  1学号,2姓名,3性别,4班级,5电话,6期末成绩,这时就能体会到结构体的作用之大了,具体看下面的代码。

#include<stdio.h>
struct student //结构体名,定义
{
long long number,tel; // 学号和电话
int score; //成绩
char name[],sex[],clas[]; //姓名,性别和班级
}; int main()
{
//假设此班的学生低于100名,声明了一个名为stu的数组变量,
//数组中的每一个元素都可以存放下一个学生的六个信息
struct student stu[];
int i;
//输入,,用循环,j假设有续名学生
for(i=;i<;i++)
scanf("%lld%s%s%s%lld%d",&stu[i].number,stu[i].name,stu[i].sex,stu[i].clas,&stu[i].tel,&stu[i].score);
//输出
for(i=;i<;i++)
printf("%lld %s %s %s %lld %d\n",stu[i].number,stu[i].name,stu[i].sex,stu[i].clas,stu[i].tel,stu[i].score);
return ;
}

运行结果:

观察上面的结果,输入了五组数据,按下回车,输出存储在数组中的结果,每个学生一行,每个学生的信息之间空一格。当数字较小的时候或许还看不出优势,可是如果当记录的学生数据达到上千组,无疑,用结构体记录学生数据是较好的方案。

比如我要在上述结构体中再添加一个信息,学生的出生年月日,此时应该怎么做呢?

可以用到结构体的嵌套,在c语言中,许多的东西都是可以嵌套的。修改上述结构体的定义可得:

#include<stdio.h>
struct date //表示日期的结构体
{
int year,month,day;
};
struct student //结构体名,定义
{
long long number,tel; // 学号和电话
int score; //成绩
char name[],sex[],clas[]; //姓名,性别和班级
struct date bri_day; //将上面的表达日期的结构体套到学生结构体中表达学生的出生年月日
};
int main()
{
struct student stu[]; //声明 //内容
}

由上面的变化可以发现有一个问题,访问年月日的时候怎么办呢?当然也是层层访问,如访问学生的出生年,就应该是:stu[i].bri_day.year;另外可以看到我在主函数里面即main()

里面只申明了student结构体,并没有声明 date结构体,那么是不是就不用声明date结构体呢?肯定不是的,注意..在student结构体的内部,我已经进行了date结构体的声明,且声明变量为bri_day.

当然,与结构体类似的类型还有共用体union和枚举型enum,用法都大同小异,理解了结构体之后再看看他们就是小case了。

简单学C——第五天的更多相关文章

  1. [老老实实学WCF] 第五篇 再探通信--ClientBase

    老老实实学WCF 第五篇 再探通信--ClientBase 在上一篇中,我们抛开了服务引用和元数据交换,在客户端中手动添加了元数据代码,并利用通道工厂ChannelFactory<>类创 ...

  2. 从零开始学Xamarin.Forms(五) 技巧

    原文:从零开始学Xamarin.Forms(五) 技巧 由于HTML5规范于2014年10月终于定稿,公司.net开发人员较少,国内外已有了较为成熟的UI框架.手机软件硬件的快速发展等等原因,所以我就 ...

  3. (素材源代码) 猫猫学IOS(五)UI之360等下载管理器九宫格UI

    猫猫分享,必须精品 先看效果 代码学习地址: 猫猫学IOS(五)UI之360等下载管理器九宫格UI 猫猫学IOS(五)UI之360等下载管理器九宫格UI http://blog.csdn.net/u0 ...

  4. Java从零开始学二十五(枚举定义和简单使用)

    一.枚举 枚举是指由一组固定的常量组成的类型,表示特定的数据集合,只是在这个数据集合定义时,所有可能的值都是已知的. 枚举常量的名称建议大写. 枚举常量就是枚举的静态字段,枚举常量之间使用逗号隔开. ...

  5. 简单学C——第二天

                 控制结构(-) 相信大家对流程图肯定很熟悉.下面我将介绍的正是关于此方面的,c语言中,控制结构大体分为选择结构和循环结构. 一.选择结构:     先贴出一般用于选择结构的语 ...

  6. 零基础学Java第五节(面向对象一)

    本篇文章是<零基础学Java>专栏的第五篇文章,文章采用通俗易懂的文字.图示及代码实战,从零基础开始带大家走上高薪之路! 本文章首发于公众号[编程攻略] 类与对象 在哲学体系中,可以分为主 ...

  7. Java从零开始学四十五(Socket编程基础)

    一.网络编程中两个主要的问题 一个是如何准确的定位网络上一台或多台主机,另一个就是找到主机后如何可靠高效的进行数据传输. 在TCP/IP协议中IP层主要负责网络主机的定位,数据传输的路由,由IP地址可 ...

  8. 简单学C——第七天

    函数 函数是C语言重要的组成部分,你现在,或者以后(如果C没什么变化的话)所写的任何一个C语言程序都是由一个一个的函数组合在一起的,当然,现在或许你只会在主函数 main中写一个小程序,那么在看了本篇 ...

  9. 简单学C——第四天

    数组 在学数组之前,有必要把前面的知识复习一遍,当然我的复习,仅仅只是提一下,而对于你,则应该认真的看一下前面的知识点,不懂可以百度,哈哈. 前面我们大致学了 1.定义变量,2.数据的输入与输出,3. ...

随机推荐

  1. ios 记录支付宝集成遇到的坑及解决方法

    今天项目中要开始动手集成支付宝支付,在此小结一下.(目前新版的支付宝SDK有较大改版,去集成还需要自己去开发平台详细的按照集成步骤来完成https://doc.open.alipay.com/docs ...

  2. Ajax 整理总结(入门)

    Ajax 学习要点: 1.Ajax 概述 2.load()方法 3.$.get()和$.post() 4.$.getScript()和$.getJSON() 5.$.ajax()方法 6.表单序列化 ...

  3. [C#] 常用工具类——加密解密类

    using System; using System.Configuration; using System.Collections.Generic; using System.Text; using ...

  4. 如何将angularJs项目与requireJs集成

    关于angularjs.requirejs的基础知识请自行学习 一.简单事例的项目目录如下: -index.html -scripts文件夹 --controller文件夹 --- mianContr ...

  5. UDP编程

    一: socket编程中的几种地址 Socket编程会遇到三种地址, 都是定义的结构体(struct): Struct in_addr     {         Unsigned int s_add ...

  6. ZooKeeper监控

    http://jm-blog.aliapp.com/?p=1450 在公司内部,有不少应用已经强依赖zookeeper,zookeeper的工作状态直接影响它们的正常工作.目前开源世界中暂没有一个比较 ...

  7. PHP汉字转拼音的两种方法+PHP提取汉字(中文)方法

    方法一:依据ASCII码转换,GB2312库对多音字也无能为力. GB2312标准共收录6763个汉字,不在范围内的汉字是无法转换.如:中国前总理朱镕基的"镕"字. GB2312中 ...

  8. ExecutorService与Executors例子的简单剖析(转)

    对于多线程有了一点了解之后,那么来看看java.lang.concurrent包下面的一些东西.在此之前,我们运行一个线程都是显式调用了 Thread的start()方法.我们用concurrent下 ...

  9. mybatis05 用户添加

    User.xml 向用户表插入一条记录. 主键返回 需求:user对象插入到数据库后,新记录的主键要通过user对象返回,这样就可以通过user获取主键值. 解决思路: 通过LAST_INSERT_I ...

  10. 在WinForm中使用委托来在其他线程中改变控件的显示

    假设winform中有两个控件: 1.ListView用来显示进度的文本提示,ID:listView_progressInfo 2.ProgressBar用来显示进度,ID:progressBar1 ...