浅谈c语言结构体
对于很多非计算机专业来说,c语言课程基本上指针都不怎么讲,更别说后面的结构体了。这造成很多学生对结构体的不熟悉。这里我就浅谈一下我对结构体的认识。
结构体,就是我们自己定义出一种新的类型,定义好之后,使用结构体定义变量就和int,char一样方便。实际上,定义一个结构体就是向内存申请一块空间来存放数据,这一点和数组有点像。但是数组只能存放类型相同的数据,而结构体则不一样,他可以存放不同类型的数据,如int,float,char,数组等。c++的类的感念就和结构体很类似,类就是加强版的结构体。我们常常使用结构体来存储一类数据,比如说一个学生的结构体,我们在里面存储id,name,grade(成员)等信息,目的是更好地处理和管理数据。
结构体的定义:
结构体一般定义在.h的头文件中,定义的形式为:
struct student
{
int id;
char name;
float grade;
};(需要注意的是,在定义的花括号最后需要加分号)
在定义好结构体之后,就可以用他来定义变量了,定义变量的方式如下:
struct student stu1 = {11,"lilei",90.5},stu2 ;这里可以部分初始化,可以全部初始化,也可以不初始化。对于数组类型数据,除了初始化的赋值之外,若在后面需要赋值,则要用strcpy或者scanf的%s方式来整体输入。定义完变量之后,就可以利用变量来调用里面的成员,形式如下:
stu1.id = 15;用.来操作结构体中的数据。
同样的,可以定义结构体的指针,形式如下:
struct student *p_stu = &stu1;指针应用结构体成员可以用箭头的方式,比如p_stu—>id = 18;也可以用成员运算符.的形式,如(*p_stu).id = 16;这三种方式引用结构体成员是完全等效的。这里的p的类型是struct student *,他的步长就是这个结构体所占的空间大小。接下来就引出结构体数组的概念。
结构体数组就是数组中的数据都是一个个的结构体变量,定义的形式如下:struct student stu[10];这样就建立了一个结构体数组,他的空间大小是10*sizeof(struct student ),若此时再用结构体指针指向数组首地址,p_stu = stu,那么就可以用指针来访问数组中的每一个结构体以及其中的成员,可以用下标法,也可以用解引用,两种方法完全等效,形式如下:
p_stu[i] 等同于stu[i]等同于*(p+i)等同于*(a+i)
这四种方式都可以用来引用结构体数组中的每一个结构体,然后在用成员运算符来引用其中的成员。
一般结构体的定义还有以下几种形式:
第一种:struct student
{
int id;
char name;
float grade;
}stu1,stu2;
这种就是在定义结构体的同时定义了两个结构体变量。
第二种:typedef struct student
{
int id;
char name;
float grade;
}s_stu,*p_stu;
这种是用s_stu,*p_stu来替代struct student和struct student*,在定义变量的时候只需要s_stu stu1,p_stu p1就可以定义一个结构体变量和一个结构体指针变量,效果和struct student stu1和struct student *p是一样的效果。
结构体还有一点要了解的就是结构体成员的对齐。结构体对齐就是一般以4,8,12位对齐,这样cpu读取的效率会比较高,当然是否对齐,多少位对齐都是可以人为设定的。
另外,结构体成员在内存空间的存储也都是连续的,在定义变量后,就开辟了一块地址空间来存数数据。而定义结构体则不会占用内存,这也是定义结构体时不能初始化的原因,而且在定义结构体的时候不能嵌套自身的结构体。但是定义结构体的时候可以嵌套别的结构体,形式如下:
typedef struct name
2 {
3 char lname[10];
4 char fname[10];
5 }nam,* p_nam;
6
7 typedef struct student
8 {
9 nam nm;
10 float grade[3];
11 float avr;
12 }s_stu,*p_stu;
引用数据的形式如下:
(p+i)->nm.fname的形式就可以引用结构体中嵌套的结构体成员了。
关于结构体,就先简单说这么多。
浅谈c语言结构体的更多相关文章
- 浅谈C语言中的强符号、弱符号、强引用和弱引用
摘自http://www.jb51.net/article/56924.htm 浅谈C语言中的强符号.弱符号.强引用和弱引用 投稿:hebedich 字体:[增加 减小] 类型:转载 时间:2014- ...
- 漫谈C语言结构体struct、公用体union空间占用
先用代码说话: #include<stdio.h> union union_data0{ int a ;//本身占用4个字节 char b ;//本身占用1个字节 int c ; }; u ...
- 解析C语言结构体对齐(内存对齐问题)
C语言结构体对齐也是老生常谈的话题了.基本上是面试题的必考题.内容虽然很基础,但一不小心就会弄错.写出一个struct,然后sizeof,你会不会经常对结果感到奇怪?sizeof的结果往往都比你声明的 ...
- 不可或缺 Windows Native (8) - C 语言: 结构体,共用体,枚举,类型定义符
[源码下载] 不可或缺 Windows Native (8) - C 语言: 结构体,共用体,枚举,类型定义符 作者:webabcd 介绍不可或缺 Windows Native 之 C 语言 结构体 ...
- Go语言结构体(struct)
Go 语言结构体 Go 语言中数组可以存储同一类型的数据,但在结构体中我们可以为不同项定义不同的数据类型. 结构体是由一系列具有相同类型或不同类型的数据构成的数据集合. 结构体表示一项记录,比如保存图 ...
- C语言结构体定义的几种方法
什么是结构体? 在C语言中,结构体(struct)指的是一种数据结构,是C语言中聚合数据类型(aggregate data type)的一类.结构体可以被声明为变量.指针或数组等,用以实现较复杂的数据 ...
- 对嵌入式开发C语言结构体的一点总结
今天冬至居然不上班,公司的良心啊!这回有心情写博客和日志了,好了,废话不多说.直接看下文: 鉴于嵌入式开发过程中,C语言结构体的使用当然是必不可少.话说,基础什么的比你会更牛逼的算法更重要,基础不牢, ...
- C语言结构体变量私有化
操作系统 : CentOS7.3.1611_x64 gcc版本 :4.8.5 问题描述 C语言结构体定义中的变量默认是公有(Public)属性,如果实现成员变量的私有(Private)化? 解决方案 ...
- 在C语言结构体中添加成员函数
我们在使用C语言的结构体时,经常都是只定义几个成员变量,而学过面向对象的人应该知道,我们定义类时,不只是定义了成员变量,还定义了成员方法,而类的结构和结构体非常的相似,所以,为什么不想想如何在C语言结 ...
随机推荐
- centos6.5 安装linux 环境
准备工作 安装make yum -y install gcc automake autoconf libtool make 安装g++ yum install gcc gcc-c++下面正式开始--- ...
- JavaScript中的数组遍历forEach()与map()方法以及兼容写法
原理: 高级浏览器支持forEach方法 语法:forEach和map都支持2个参数:一个是回调函数(item,index,list)和上下文: forEach:用来遍历数组中的每一项:这个方法执行是 ...
- Nginx基础知识之————RTMP模块中的中HLS专题(翻译文档)
一.在Nginx配置文件的RTMP模块中配置hls hls_key_path /tmp/hlskeys; 提示错误信息: nginx: [emerg] the same path name " ...
- 跨站请求伪造 CSRF / XSRF<一:介绍>
跨站请求伪造(英语:Cross-site request forgery),也被称为 one-click attack 或者 session riding,通常缩写为 CSRF 或者 XSRF, 是一 ...
- Java四种线程池
Java四种线程池newCachedThreadPool,newFixedThreadPool,newScheduledThreadPool,newSingleThreadExecutor 时间:20 ...
- PHP data
- 微信微信JS-SDK 6.0.2 填坑笔记
0.为什么以前不需要配置这么麻烦就可以修改分享description 等信息,但是现在不行了. 因为6.0.2版本之前没有做权限验证,所以config都是ok,但这并不意味着你config中的签名是O ...
- 数据库DDL审计
一.为什么需要数据库DDL审计? DDL在生产系统中扮演非常重要的作用. 1)首先从业务角度来说,DDL可能意味着表结构变更,意味着新的版本即将发布,是个重要的时刻. 2)其次从运维角度来说,DDL尤 ...
- neatbean 8+版本 配置
//更改代码行距 打开C:\Users\{yourname}\AppData\Roaming\NetBeans\7.3.1\config\Editors\Preferences,用文本编辑器打开 or ...
- SPSS数据分析—聚类分析
多元分析的主要思想之一就是降维,我们已经讲过了很多降维的方法,例如因子分析.主成分分析,多维尺度分析等,还有一种重要的降维方法,就是聚类分析. 聚类分析实质上就是按照距离远近将数据分成若干个类别,使得 ...