浅谈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语言结 ...
随机推荐
- div+css常见浏览器兼容问题以及解决办法
1.图片下方出现几像素的空白间隙问题说明:这个问题在ie6和ff(火狐)下经常见到,例如 <div><img src=""/></div>这个图 ...
- Strus2学习:基础(一)
Strus2基础: Sturs2起源以及背景: 在起源很早(2002年左右)的 strus1 和 webWork 基础上进行扩展,并且兼容这两大框架!总之很好用啦,随着学习的深入,应该会有更好的诠释的 ...
- :after和:before的作用及使用方法
1. :before 和 :after 的主要作用是在元素内容前后加上指定内容,示例: HTML代码: <p>你好</p> CSS代码: p:before{ content: ...
- arm-linux-androideabi-addr2line
./arm-linux-androideabi-addr2line -C -f -e libc.so 00040d94
- Python_Day12_python mysql and ORM and redis
本节内容 数据库介绍 mysql 数据库安装使用 mysql管理 mysql 数据类型 常用mysql命令事务 创建数据库 外键 增删改查表 权限 事务 索引 python 操作mysql 1. 数 ...
- GNS3 IOU 配置
GNS3使用视频: http://edu.51cto.com/lesson/id-25295.html GNS3 IOU 与VM http://www.mamicode.com/info-detail ...
- VWmare workstation12.5中出现的问题
安装VWmare Workstation12.5之后,出现只能从主机复制文件到虚拟机,但是虚拟机的文件不能直接拖到主机中进行复制.所以我们需要重新安装VWmare Tools. 在虚拟机的VM-> ...
- adb命令学习
录制屏幕操作Android4.4版本以上支持录制屏幕 adb shell screenrecord /sdcard/demo.mp4 ADB logcat 输出时间信息: adb logcat -v ...
- FullPage.js – 轻松实现全屏滚动(单页网站)效果
FullPage.js 是一个简单而易于使用的插件,用来创建全屏滚动网站(也被称为单页网站).除了可以创建全屏滚动效果以外,也可以给网站添加一些水平的滑块效果.能够自适应不同的屏幕尺寸,包括平板电脑和 ...
- 数字图像处理作业使用OpenCV - 使用笔记
数字图像处理作业的输入图像全部都是灰度图像,所以汇总一下自己遇到的问题答案. OCV的图像容器是Mat<typename>,可以用imread(filename)读取图像,filename ...