浅谈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语言结 ...
随机推荐
- Mysql notes
1. 数据库操作 database management create database sampleDatabase; --创建数据库sampleDatabase show databases; - ...
- ISS_1建站使其能够用ipad浏览器下载安装x-code开发的程序
一:第一种方法 1:把ipa上传到一个https类型的网站比如:https://worktile.com 2:更改plist中urrl <?xml version="1.0" ...
- URL编码和解码工具
开发中发现需要进行URL的编解码,每次百度出来的还带广告而且比较慢,写了一个本地的工具,比较简单,希望对大家有帮助. <!DOCTYPE html PUBLIC "-//W3C//DT ...
- MongoDB简介与增删改查
一.简介 MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统.MongoDB 旨在为WEB应用提供可扩展的高性能数据存储解决方案.MongoDB 将数据存储为一个文档,数据 ...
- jQuery 移动端ajax请求列表数据,实现点击翻页效果(还有手势往下滑动翻页)。
1 首先是html部分 <div class="content"> <div class="list"></div> // ...
- git的常用命令
简介 上篇讲解git的博客,在centos6.5中安装完成了github客户端,接下来我们来熟悉git的操作命令 1.查看自己机器中安装的git版本 [root@jacky conf]# git - ...
- ps
快速恢复默认值 有些不擅长Photoshop的朋友为了调整出满意的效果真是几经周折,结果发现还是原来的默认效果最好,这下傻了眼,后悔不该当初呀!怎么恢复到默认值呀?试着轻轻点按选项栏上的工具图标,然 ...
- sqlite字段属性删除方法
Sqlite 不支持直接修改字段的名称. 我们可以使用别的方法来实现修改字段名. 1.修改原表的名称 ALTER TABLE table RENAME TO tableOld; 2.新建修改字段后的表 ...
- js递归方法创建节点
var jsonData = [{,,"subnetRemark":"状态自带","subnetName":"中心网络" ...
- ES5——函数,对象,方法,this
JS由表达式和语句组成 表达式:计算出一个值,但并不进行任何操作,不改变计算机运行状态 语句:包括 声明语句,赋值语句,控制结构 函数,对象,方法,this 数组和对象:是两个非常重要的数据类型 函数 ...