C语言中数组是把相同类型的数据类型的变量集中在一起了,而结构体则是把不同类型的变量聚集在一起。

结构体也是一种数据类型,但是它是一种自定义的数据类型,也就是说和使用其他数据类型不一样,我们得先定义这种数据类型,然后才能用这种数据类型定义结构体变量,最后使用结构体变量。

以下以学生结构体为例进行实际操作

一、定义结构体数据类型,有三种方法,

1、第一种是先定义结构体类型,再使用此类型定义变量:

 struct stu{
int num;
char *name;
char sex;
float score;
}; struct stu stu1,stu2;

这种定义方式中,前面的1到6行定义结构体类型,第8行使用结构体类型定义结构体变量。接下来就可以使用变量stu1,stu2.

2、第二种方法是定义结构体的同时定义结构体变量:

   struct stu{
int num;
char *name;
char sex;
float score;
}stu1,stu2;

这种方法比较简洁,但程序可读性较第一种差。

3、第三种方法就是,如果我后续不会再定义新的结构体变量,那就可以在方法2的基础上忽略结构体名:

   struct {
int num;
char *name;
char sex;
float score;
}stu1,stu2;

但使用这种方法后续想定义结构体变量时没法定义,故不推荐。

推荐使用第一种方法,先定义结构体类型,再定义结构体变量。

二、结构体类型重定义:

1、在定义结构体的同时进行重命名:

 typedef struct stu{
int num;
char *name;
char sex;
float score;
} STU; //定义结构体变量:
STU stu1;
STU stu2;

2、先定义结构体类型,后重命名:

 struct stu{
int num;
char *name;
char sex;
float score;
} STU; typedef sturct stu STU; STU stu1;
STU stu2;

三、结构体变量的使用:

1、基本使用:

 struct stu{  //定义结构体类型
int num;
char *name;
char sex;
float score;
}; struct stu stu1= {, "汤唯唯", 'M', }; //定义结构体变量 printf("%d学生的姓名是%s,性别是%c,成绩为%f", stu1.num, stu1.name, stu1.sex, stu1.score); //使用结构体变量

由以上程序可知,访问结构体变量中的成员值时,使用结构体变量名.结构体成员变量名的方式,如要访问stu1的姓名使用stu1.name;

 //结构体直接可以直接赋值
stu1 = {, "xiaoming", 'F', };
stu2 = stu1;

结构体变量可以直接赋值,相当于把所有成员变量的值赋给另一个结构体对应的成员变量。

2、复杂应用:
以下程序的功能是使用把每个学生的学号,姓名,性别,成绩封装再一个结构体变量中,然后把四个学生的以上信息使用数组封装,然后使用选择法对四个学生的成绩从高到低进行排序,然后循环输出的过程:(涉及数组、循环)

 struct stu{
int num;
char *name;
char sex;
float score;
}; //定义结构体变量数组
struct stu st[] = {{, "汤唯唯", 'M', },
{, "李亚鹏", 'M', },
{, "周芷若", 'F', },
{, "刘亦菲", 'F', }
};
struct stu tmp; //选择法比较大小
for (int i=; i<; i++) {
int max=i;
for (int j=i+; j<; j++) {
if(st[max].score<st[j].score){
max=j;
}
}
if (i!=max) {
tmp=st[i];
st[i]=st[max];
st[max]=tmp;
}
}
// 循环打印四个学生的成绩
for (int i=; i<; i++) {
printf("学号为%d的%s性别为%c,成绩为%.0f\n",st[i].num,st[i].name,st[i].sex,st[i].score);
}

回车后返回的结果为:

 学号为4的刘亦菲性别为F,成绩为82
学号为3的周芷若性别为F,成绩为80
学号为1的汤唯唯性别为M,成绩为76
学号为2的李亚鹏性别为M,成绩为50
Program ended with exit code:

注意:在对学生的成绩排序时,不能只对单独对成绩排序,要根据成绩把学生的所有信息进行交换,否则输出后每个学生的成绩就发生了变化,和以前不一致了,我们需要的只是排名次。

3、结构体和函数的混合:计算两个复数相加:

main主函数中的调用程序:

 struct complex x = {6.5, 8.9},y = {7.1, 9.4};
struct complex z;
z = add(x,y);
printf("和为:%5.1f+%4.1fi\n",z.re,z.im);

add()子函数的实现过程:

 struct complex{
double re;
double im;
}; struct complex add(struct complex a, struct complex b){
struct complex z;
z.re = a.re + b.re;
z.im = a.im + b.im;
return z;
}

前四行定义复数的结构体struct complex,6到11行定义了一个返回值为struct complex的函数,该函数的形参为两个struct complex类型的复数,在函数内部通过复数加法运算(实部+实部,虚部+虚部)的计算方法算出结果,之后返回给调用它的主函数,由主函数调用printf打印。

C语言-结构体的更多相关文章

  1. 漫谈C语言结构体struct、公用体union空间占用

    先用代码说话: #include<stdio.h> union union_data0{ int a ;//本身占用4个字节 char b ;//本身占用1个字节 int c ; }; u ...

  2. 解析C语言结构体对齐(内存对齐问题)

    C语言结构体对齐也是老生常谈的话题了.基本上是面试题的必考题.内容虽然很基础,但一不小心就会弄错.写出一个struct,然后sizeof,你会不会经常对结果感到奇怪?sizeof的结果往往都比你声明的 ...

  3. 不可或缺 Windows Native (8) - C 语言: 结构体,共用体,枚举,类型定义符

    [源码下载] 不可或缺 Windows Native (8) - C 语言: 结构体,共用体,枚举,类型定义符 作者:webabcd 介绍不可或缺 Windows Native 之 C 语言 结构体 ...

  4. Go语言结构体(struct)

    Go 语言结构体 Go 语言中数组可以存储同一类型的数据,但在结构体中我们可以为不同项定义不同的数据类型. 结构体是由一系列具有相同类型或不同类型的数据构成的数据集合. 结构体表示一项记录,比如保存图 ...

  5. C语言结构体定义的几种方法

    什么是结构体? 在C语言中,结构体(struct)指的是一种数据结构,是C语言中聚合数据类型(aggregate data type)的一类.结构体可以被声明为变量.指针或数组等,用以实现较复杂的数据 ...

  6. 对嵌入式开发C语言结构体的一点总结

    今天冬至居然不上班,公司的良心啊!这回有心情写博客和日志了,好了,废话不多说.直接看下文: 鉴于嵌入式开发过程中,C语言结构体的使用当然是必不可少.话说,基础什么的比你会更牛逼的算法更重要,基础不牢, ...

  7. C语言结构体变量私有化

    操作系统 : CentOS7.3.1611_x64 gcc版本 :4.8.5 问题描述 C语言结构体定义中的变量默认是公有(Public)属性,如果实现成员变量的私有(Private)化? 解决方案 ...

  8. 在C语言结构体中添加成员函数

    我们在使用C语言的结构体时,经常都是只定义几个成员变量,而学过面向对象的人应该知道,我们定义类时,不只是定义了成员变量,还定义了成员方法,而类的结构和结构体非常的相似,所以,为什么不想想如何在C语言结 ...

  9. 将c语言的结构体定义变成对应的golang语言的结构体定义,并将golang语言结构体变量的指针传递给c语言,cast C struct to Go struct

    https://groups.google.com/forum/#!topic/golang-nuts/JkvR4dQy9t4 https://golang.org/misc/cgo/gmp/gmp. ...

  10. Linux C语言结构体-学习笔记

    Linux C语言结构体简介 前面学习了c语言的基本语法特性,本节进行更深入的学习. 预处理程序. 编译指令: 预处理, 宏定义, 建立自己的数据类型:结构体,联合体,动态数据结构 c语言表达式工具 ...

随机推荐

  1. Disassembly1:HelloWorld

    我这里学习汇编语言的思路就是逆向C++源码. 先从最简单的一个程序入手:

  2. PHP递归算法的一个实例 帮助理解

    递归函数为自调用函数,在函数体内直接或间接自己调用自己,但需要设置自调用的条件,若满足条件,则调用函数本身,若不满足则终止本函数的自调用,然后把目前流程的主控权交回给上一层函数来执行,可能这样给大家讲 ...

  3. Mysql 随机查询数据

    SELECT * FROM tablename ORDER BY RAND() LIMIT 10

  4. new del 问题

    实验一: new_del_caller工程(静态库) -new_del_caller.cpp #include <new> void new_del_caller() { ]; delet ...

  5. OGG 文档

    [OGG]OGG的下载和安装篇 http://www.cnblogs.com/lhrbest/p/4564013.html [OGG]OGG的单向DML复制配置(一) http://www.cnblo ...

  6. Spring+Struts集成(方案一)

    SSH框架是现在非常流行的框架之一,本文接下来主要来对Spring和Struts的集成进行展示. 集成原理:在Action中取得BeanFactory,通过BeanFactory取得业务逻辑对象. 集 ...

  7. getHibernateTemplate()

    getHibernateTemplate 前提条件:你的类必须继承HibernateDaoSupport 一: 回调函数: public List getList(){   return (List ...

  8. 利用cookie实现“只弹出一次窗口”的JS代码

    弹出式窗口通常被用来做弹出广告(CPM),其实用弹出式窗口用来做消息通知也是最普遍而且是最有效的方法,但如果每次刷新页面特别是刷新首页都要弹出窗口的话,那绝对是让访问者厌烦的事情. 比如你将上面的脚本 ...

  9. Python之路: socket篇

    (默认)与特定的地址家族相关的协议,如果是  ,则系统就会根据地址格式和套接类别,自动选择一个合适的协议 sk import socketip_port = ()sk = socket.socket( ...

  10. 再探CRC(转)

    源:http://hi.baidu.com/skystalker/item/228a263147f74e87f5e4ad8d 之前写了CRC16的程序,虽说能用,却不知其所心然,现在要用CRC32,重 ...