知识点:

1)结构体的定义。

2)结构体的sizeof。

3)  结构体的指针。

1) 结构体的定义:

在逻辑上有一定关联的多个数据类型做为一整体进行操作的数据结构,它的关键字是struct。下面我将定义一个结构体

struct Student{

  char *name;

  int age;

  int sid;

};

我用上面定义的结构体Student来定义一个变量。

struct Student student;

上面的代码有点烦,其实我可以这样写

struct Student{

  char *name;

  int age;

  int sid;

} student;

或者有typedef来给它定义一个别名

typedef struct Student{

  char *name;

  int age;

  int sid;

} Student;

Student student;

现在我已经定义了一个student结构体变量,下面将对它赋值:

student={"lishi",23,1001};

当然我也可以用点号去给它里面的成员赋值:

student.name="lishi";student.age=23;student.sid=1001;

2) 结构体的sizeof。

上面我定义的结构体Student 在64位的机器上占用多少个字节了,是不是所有成员所占用的字节数之和了,答案肯定不是的,当然也有巧合了,如果里面成员都是同类型的数据。它的大小应该大于等于所有成员之和。这里涉及到一个内存对齐的概念,这里就不细说这个。当我们定义一个结构体是,它的默认对齐模型大小是它成员之中占用字节最多的类型, 比如上面的Student之中,字符指针占用的字节数最多,是8个字节。所以Student占用的字节数是8的整数倍。然而有人会问,我们可以改变这个默认对齐大小?当然可以,我们可以通过 #pragma pack(N)告之编译器,我们要指定对齐大小,其中N 是2的指数。这里得指出,不是你想把它改成多大就多大,如果N大于结构体中占用字a节最多的类型,对齐大小将是占用字节最多的类型。我总结下面几点

a.结构体总大小必须是“对齐大小”的整数倍
b.每个成员的起始地址必须是"自身对齐大小的"整数倍
c.对齐大小由 自身类型和最大成员类型和pack(N)决定
d.N是2的指数

这里要注意一点,比如我在结构体里定义了一个数组,对齐大小是不是等于这个数组的大小,当然不是,这个只跟数组的类型有关。

3)  结构体的指针。

下面我将定义一个结构体指针,假设我们已经给它定义了一个别名Student.

Student *std;

这样我就可以通过->运算符去访问它的成员了,例如:std->name="lishi";

还有一点要注意一下,结构变量可以赋值为另外一个结构变量,变量名只是相当于给申请的内存空间定义了一个名字,就相当于int类型定义变量一样,不想数组名是指向它的第一个元素的地址。

C语言结构体-struct的更多相关文章

  1. 漫谈C语言结构体struct、公用体union空间占用

    先用代码说话: #include<stdio.h> union union_data0{ int a ;//本身占用4个字节 char b ;//本身占用1个字节 int c ; }; u ...

  2. Go语言结构体(struct)

    Go 语言结构体 Go 语言中数组可以存储同一类型的数据,但在结构体中我们可以为不同项定义不同的数据类型. 结构体是由一系列具有相同类型或不同类型的数据构成的数据集合. 结构体表示一项记录,比如保存图 ...

  3. C语言 - 结构体(struct)比特字段(:) 详细解释

    结构体(struct)比特字段(:) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26722511 结构体(struc ...

  4. C 语言结构体 struct 及内存对齐

    struct 结构体 对于复杂的数据类型(例如学生.汽车等),C 语言允许我们将多种数据封装到一起,构成新类型. 跟面向对象语言中的对象相比,结构体只能包含成员变量,不支持操作. #include & ...

  5. c 语言结构体struct的三种定义方式 及 typedef

    struct 结构体名{ 成员列表: ..... }结构体变量: 结构体类型变量的定义 结构体类型变量的定义与其它类型的变量的定义是一样的,但由于结构体类型需要针对问题事先自行定义,所以结构体类型变量 ...

  6. 结构体(struct)大小

    结构体(struct)大小 本文参考链接:C语言结构体(struct)常见使用方法,链接中的实例代码经实践有几处不准确,本文在引用时已做更改 注意:在结构体定义时不能申请空间(除非是结构体变量),不可 ...

  7. 将c语言的结构体定义变成对应的golang语言的结构体定义,并将golang语言结构体变量的指针传递给c语言,cast C struct to Go struct

    https://groups.google.com/forum/#!topic/golang-nuts/JkvR4dQy9t4 https://golang.org/misc/cgo/gmp/gmp. ...

  8. go语言之行--结构体(struct)详解、链表

    一.struct简介 go语言中没有像类的概念,但是可以通过结构体struct实现oop(面向对象编程).struct的成员(也叫属性或字段)可以是任何类型,如普通类型.复合类型.函数.map.int ...

  9. Swift语言精要 - 浅谈结构体(Struct)

    CGRect, CGSize, CGPoint这些是 . String, Int, Array, Dictionary这些我们经常用的也是结构体(Struct). 那么结构体(Struct)到底是什么 ...

随机推荐

  1. MVC5+EF6 Code First 从零开始——第一章

    一直在用Database First 突然感觉关系复杂的时候,生成json经常出现死循环,不够灵活. 今天正好是周五,不太忙就想试试code first吧,试了2次,终于有结果. ok废话不多说,先撸 ...

  2. oracle 密码过期处理

    1.查看用户的proifle是哪个,一般是default sql>SELECT username,PROFILE FROM dba_users; 2.查看指定概要文件(如default)的密码有 ...

  3. oracle,sqlserver同一个表两个字段和成一个列查询 (详询请加qq:2085920154)

    sql 同一张表开两个字段合成一个字段 例如   SQL tab 字段1 字段2 字段3 3 4 莫 合成 tab 字段1 字段2 3-4 莫     SQL SERVER select 字段1 + ...

  4. Sprint3(12.18)总结

    Sprint3第三阶段 1.类名:软件工程-第三阶段 2.时间:至12.18 3.选题内容:web版-餐厅到店点餐系统 4.团队博客地址: http://www.cnblogs.com/queenju ...

  5. json改造优化无刷新分页

    index.html dd

  6. Hadoop2.6.0的事件分类与实现

    前言 说实在的,在阅读Hadoop YARN的源码之前,我对于java枚举的使用相形见绌.YARN中实现的事件在可读性.可维护性.可扩展性方面的工作都值得借鉴. 概念 在具体分析源码之前,我们先看看Y ...

  7. EXCEL的导入导出

    using System; using System.Data; using System.Data.OleDb; using System.IO; namespace COMMON { public ...

  8. 如果因特网中的所有链路都提供可靠的交付服务,TCP可靠传输服务是多余的吗?

    IP协议因为是无连接的, 所以其传输是不可靠的.虽然链路保证了数据包在端到端的传输中不发生差错,但是它不能保证IP数据包是按照正确的书需到达最终的目的地.IP数据包可以使用不同的路由通过网络,到达接收 ...

  9. SharePoint 2013开发入门探索(二)- 列表操作

    我们如何用代码对SharePoint列表做些例如增删改查的操作呢?如果您的程序可以部署到服务器上,就可以使用 服务器对象模型,因为服务器对象模型提供的功能最多,限制最少:否则可能要选择客户对象模型等其 ...

  10. kinect driver install (ubuntu 14.04 & ros-indigo)

    kinect driver 安装过程: 1.在ubuntu上安装kinect驱动比较繁琐,需要安装以下3个驱动包, OpenNI-Bin-Dev-Linux-x64-v1.5.7.10 NITE-Bi ...