结构体

首先明确,结构体是一种构造的数据类型,是一种由多个数据类型如 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. Java对象的强、软、弱和虚引用详解

    1.对象的强.软.弱和虚引用 转自:http://zhangjunhd.blog.51cto.com/113473/53092/ 在JDK 1.2以前的版本中,若一个对象不被任何变量引用,那么程序就无 ...

  2. JGit与远程仓库链接使用的两种验证方式(ssh和https)

    JGit是使用JAVA的API来操控Git仓库的库,由Eclipse公司维护.他提供的API分成两个层次,底层命令和高层命令.底层API是直接作用于低级的仓库对象,高层的API是一个面向普通用户级别功 ...

  3. sql优化-hint的作用

    目前,oracle采用的是CBR优化器,所以在有些时候,机器会按照自己的意愿去执行sql,当然oracle是根据本身的一些信息来做决定的,比如:统计信息.但有些时候,机器并不一定会按照我们预想的那样去 ...

  4. 【iOS-Android开发对照】 之 APP入口

    [iOS-Android开发对照]之 APP入口 [图片 Android vs iOS] 提纲 对照分析iOS,Android的入口, iOS,Android的界面单元 为什么要有那样的生命周期 继承 ...

  5. 创业公司求IOS、Android攻城狮一枚

    地点:北京CBD附近(地铁1号线大望路) 魅力值:送珍贵期权 你要会:       1. IOS或者Android开发       2.可以处理类似微视/秒拍的视频录制功能       3.熟悉jso ...

  6. Linux学习笔记总结--CentOS 设置静态IP

    1.修改网卡配置 vi /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE=eth0 #描述网卡对应的设备别名,例如ifcfg-eth0的文件中它为eth ...

  7. centos6.7 install chrome

    1.yum仓库 (如果用rpm包安装 可以忽略此步) vim /etc/yum.repos.d/google-chrome.repo [google-chrome] name=google-chrom ...

  8. Dom4j解析Xml文件,Dom4j创建Xml文件

    Dom4j解析Xml文件,Dom4j创建Xml文件 >>>>>>>>>>>>>>>>>>&g ...

  9. 洛谷 P1731 生日蛋糕

    /*洛谷 1731 生日蛋糕 傻傻的-1 T成了傻逼*/ #include<cstdio> #include<iostream> #include<cmath> # ...

  10. C#基础入门--关于C#背景介绍以及变量相关

    在正式探索C#的奥秘之前,我们先谈一谈关于学习方法的问题吧.你会不会有这样的感悟,自己努力奋斗得到的东西倍加珍惜,飘到眼前的,却不屑一顾.我认为,学习的整个历程亦是如此.在学习过程中,只有我们遇到了问 ...