前言

一直以来,C语言的学习都在入门阶段,只用到数组、函数、循环、选择、位运算这些基本的知识,较少用到指针、预处理、结构体、枚举类型、文件操作等这些C语言的精髓内容,现在想想真不敢说自己熟练掌握C语言的使用,所以最近几篇文章是关于这些内容的,一方面是巩固自己的C语言编程能力,另一方面也为以后学习C++做准备。

什么是结构体

C语言的结构体实际上就是一种特殊的数据类型,只不过这种数据类型包括了很多个基本类型的数据,如int、float、char等等,如在开发学生成绩管理系统时,有学号、姓名、院系、班级、年龄、各个科目、各个科目对应的成绩等,不使用结构体我们需要定义许多的变量,而使用结构体可以大大简化程序的设计,

结构体类型的定义

结构体的定义格式为:

struct 结构体名称
{
结构体所包含的成员变量;
}

与C++不同的是,C语言的结构体只能包括成员变量,不能包含成员函数,但可以定义函数指针指向一个函数。

定义一个名为student的结构体类型,包含id、name、score这3个成员变量。

struct student
{
int id;
char *name;
float score;
};

定义两个student的结构体变量:

struct student lucy, jack;

当然,也可以在定义结构体的同时定义结构体变量:

struct student
{
int id;
char *name;
float score;
}lucy, jack;

即把变量名放在定义结构体的最后即可。

如果只需要定义lucy、jack两个结构体变量,后面其他地方都不需要再定义新的结构体变量,那么结构体名可以省略,不建议使用这种方式:

struct
{
int id;
char *name;
float score;
}lucy, jack;

这种写法看起来是稍微简单了一些,但后面无法再定义新的结构体变量。

结构体变量在内存中的存储

理论上和数组元素的存储非常类似,结构体变量的存储也是连续存储的,但在实际的编译器实现过程中,各个成员变量之间可能会存在缝隙。

结构体变量

【示例】:

#include "stdio.h"
#include "stdlib.h" struct student
{
int id;
char *name;
float score;
}; struct student jack; int main(void)
{
//成员的赋值
jack.id = 1234;
jack.name = "jack";
jack.score = 89.5; printf("%s id: %d, score: %.1f \r\n", jack.name, jack.id, jack.score); return 0;
}

【输出结果】:

jack id: 1234, score: 89.5

当然,也可以在定义的时候整体赋值:

struct student lucy, jack = {1233, "jack", 92.6};

但不可以在定义之后,单独整体赋值;

struct student lucy;
lucy = {1233, "lucy", 92.6};

这种整体赋值不允许,会报错。

结构体数组

当然也允许定义结构体数组:

struct student cls[5];

定义的数组可以不指定数组大小。

【示例】:

#include "stdio.h"
#include "stdlib.h" struct student
{
int id;
char *name;
float score;
};
//定义的同时整体赋值
struct student cls[5] = //也可以不给出数据大小: cls[]
{
{1001, "Li Lei", 88.4},
{1002, "Zhang Wei", 79.3},
{1003, "Wang Ming", 70.8},
{1004,"Zhao Yang", 80.5},
{1005,"Li Liang", 89.5}
}; int main(void)
{
int i;
int num_80 = 0; //分数大于80的人数
float average = 0, sum = 0; //平均分和总和 for(i = 0; i < 5; i++)
{
sum += cls[i].score;
if(cls[i].score > 80)
num_80++;
}
average = sum / 5.0; printf("分数大于80的人数:%d,总平均分:%.1f", num_80, average);
return 0;
}

【输出结果】:

分数大于80的人数:3,总平均分:81.7

结构体指针变量

定义格式为:

struct student *p;

【示例一】:

#include "stdio.h"
#include "stdlib.h" struct student
{
int id;
char *name;
float score;
};
//定义的同时整体赋值
struct student *pstu, stu = {1234, "lucy", 90.4}; int main(void)
{
pstu = &stu; //*pstu 等同于 stu printf("id: %d, name: %s, score: %.1f \n", stu.id, stu.name, stu.score);
printf("id: %d, name: %s, score: %.1f \n", (*pstu).id, (*pstu).name, (*pstu).score);
printf("id: %d, name: %s, score: %.1f \n", pstu->id, pstu->name, pstu->score); //指针变量引用成员变量 return 0;
}

【输出结果】:

id: 1234, name: lucy, score: 90.4
id: 1234, name: lucy, score: 90.4
id: 1234, name: lucy, score: 90.4

【示例二】

#include "stdio.h"
#include "stdlib.h" struct student
{
int id;
char *name;
float score;
}; struct student *ps;
struct student cls[] =
{
{1001, "Li Lei", 88.4},
{1002, "Zhang Wei", 79.3},
{1003, "Wang Ming", 70.8},
{1004,"Zhao Yang", 80.5},
{1005,"Li Liang", 89.5}
}; int main(void)
{
int len = sizeof(cls) / sizeof(struct student); //求数组长度
printf("id \t name \t score \n"); for(ps = cls; ps < cls + len; ps++)
{
printf("%d \t %s \t %.1f \n", ps->id, ps->name, ps->score);
}
return 0;
}

【输出结果】:

id       name    score
1001 Li Lei 88.4
1002 Zhang Wei 79.3
1003 Wang Ming 70.8
1004 Zhao Yang 80.5
1005 Li Liang 89.5

参考资料:

Jlink使用技巧系列文章:


欢迎大家关注我的个人博客

或微信扫码关注我的公众号

C语言学习之结构体的更多相关文章

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

    结构体定义三种方式: #include<stdio.h> //第一种定义方法 struct point { int x; int y; }; struct point p1,p2; //第 ...

  2. c语言学习笔记 - 结构体位域

    在学习结构体的时候遇到了位域这个概念,位域主要是为了节省内存空间,比如用一个32位,4个字节的int存储一个开关变量时,会造成空间浪费,于是干脆就考虑在这个32划分不同的区域来存储数据,例如划出1位存 ...

  3. C语言学习1——结构体剖析

    一、定义结构体变量的方法 1.1先声明结构体类型在定义变量名 例如: a.声明结构体类型 struct student { int num; char name[20]; char sex; int ...

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

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

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

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

  6. golang | Go语言入门教程——结构体初始化与继承

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是golang专题第10篇文章,我们继续来看golang当中的面向对象部分. 在上一篇文章当中我们一起学习了怎么创建一个结构体,以及怎么 ...

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

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

  8. Go语言基础之结构体

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

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

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

随机推荐

  1. windows 服务器MYSQL 数据库安装配置

    一.到官网下载MYSQL 打开官网地址:www.mysql.com, 选择 DOWNLOADS,进入到MySQL的下载页面,在页面的底部有一个MySQL Community Edition, 并且下面 ...

  2. Java 如何启用 ARM 虚拟机诊断

    现象描述 如何通过 Java 语言实现在创建 ARM 虚拟机时开启诊断,并配置相关指标.   实现思路 调研最高版本的 JAVA SDK(1.1.0)源码发现,SDK 层面并未提供任启动诊断和配置诊断 ...

  3. java读取txt文件的2中方法---并将内容(每一行以固定的字符分割切成2段)存到map中去

    #java读取txt文件的第一种方法 /** * 方法:readTxt * 功能:读取txt文件并把txt文件的内容---每一行作为一个字符串加入到List中去 * 参数:txt文件的地址 * 返回: ...

  4. ensp 路由器无法启动

    出现错误代码 40.41等几乎都是虚拟机问题, 卸载干净后重新安装就好.推荐卸载软件:iobit uninstaller 安装注册后无法创建Host-Only,最好更换虚拟机版本, 我用的虚拟机版本是 ...

  5. dll动态链接库导出函数方法 -- 静态导出(__declspec前缀导出)

    简介 在之前已经笔者已经写过利用.def文件进行dll函数动态导出的文章,那么今天就给大家介绍一下,如何利用**__declspec**函数前缀进行简单的静态函数导出. 要点 大家阅读过动态导出的文章 ...

  6. a.c:5:5: warning: ignoring return value of ‘scanf’, declared with attribute warn_unused_result [-Wun

    PTA做题时出现的错误,用if括起来就没有了. if(scanf("%d",&a)){}; 其实并不是这里有问题,如果你的输出有问题,他就会鸡蛋里挑骨头的先显示这个错误.

  7. 记录一次向TiDB数据库导入数据的例子

    导出数据 今天从Mysql的某个库中导出一个表大概有20分钟吧,等了一会终于导出成功了.查看一下文件的大小: [tidb@:vg_adn_CkhsTest ~]$du -h ./creative_ou ...

  8. AfxBeginThread

    用户界面线程和工作者线程都是由AfxBeginThread创建的.现在,考察该函数:MFC提供了两个重载版的AfxBeginThread,一个用于用户界面线程,另一个用于工作者线程,分别有如下的原型和 ...

  9. [Android自动化] 在 pip-9.0.1 版本情况下安装 uiautomator2 报错的解决办法

    1.在命令窗口中使用命令: pip install uiautomator2 时报 pip 版本过低,需要先升级 pip 版本,理论上会按照提示进行升级 pip 操作,但执行升级命令时到最后却还是报错 ...

  10. python reload(sys)找不到,name 'reload' is not defined和Python3异常-AttributeError: module 'sys' has no att

    基于python3.6.1版本,在一个.py文件中,加入这3行:import requests, re, sysreload(sys)sys.setdefaultencoding("utf- ...