浅谈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语言结 ...
随机推荐
- js 定义方法的集中方式
1:调用关键字function来构造 如: function distance(x1,x2,y1,y2) { var dx = x2 - x1; var dy = y2 ...
- CSS选择器详解
选择器是CSS的核心,从最初的元素.class/id选择器,演进到伪元素.伪类,以及CSS3中提供的更丰富的选择器,定位页面上的任意元素开始变得愈发的简单. 1.元素选择器 这是最基本的CSS选择器, ...
- 基本shell命令使用笔记
linux常用命令: (ls:列出目录内容) -a/-all 列出所有文件,包括隐藏文件 -l 使用长格式显示详细信息,包括rwx (mkdir:建立目录) -p/-parents 若要建立目录的上层 ...
- python 安装MySQLdb mysql_config not fount
缺少 libmysqlclient-dev 应该是安装MySQL的锅. 资料:http://www.cnblogs.com/xiazh/archive/2012/12/12/2814289.html ...
- 关于HTML5音频——audio标签和Web Audio API各平台浏览器的支持情况
对比audio标签 和 Web Audio API 各平台浏览器的支持情况: audio element Web Audio API desktop browsers Chrome 14 Yes ...
- Android的系统体系结构
目录: Android的系统体系结构 Android的四种常用组件 Activity的启动流程 Android的系统体系结构 在入门了一个简单的Android的Hello World以后,我们首先来看 ...
- centos 开机启动服务
一.启动脚本 /etc/rc.local 启动 最简单的一种方式,在启动脚本 /etc/rc.local (其实 /etc/rc.local 是/etc/rc.d/rc.local 的软链接文件,实际 ...
- SSIS excel2003文件导入列名显示为F1,F2 - FN
问题现象: 数据源2003版本的EXCEL文件,第一列是空白,数据是从第二列开始的.所以SSIS中用EXCEL数据源倒入这个EXCEL时,所有的列显示不出来,显示的是F1,F2 - FN. 解决方法 ...
- 红包demo
嘿嘿,红包demo import random dic={} lis=['KeLan','MonKey','Dexter','Superman','Iron Man','Robin'] def red ...
- Loading加载小插件,用户可以选择html格式或canvas格式,自定义loading图片,canvas色彩搭配可根据个人喜好
;(function($) { $.Loading = function(options) { //暴漏插件默认值 $.Loading.defaults = { speed: 200, //弹出层淡出 ...