知识点:

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. 第六章 springboot + 事务(转载)

    本篇博客转发自:http://www.cnblogs.com/java-zhao/p/5350106.html 在实际开发中,其实很少会用到事务,一般情况下事务用的比较多的是在金钱计算方面. myba ...

  2. 在Linux上配置xampp后远程访问域名报错

    在Linux上配置xampp后远程访问域名报错: New XAMPP security concept: Access to the requested object is only availabl ...

  3. [erlang]一次erlcron崩溃引起的事故分析

    事故背景 由于误操作在erlcron设置了一个超过3个月后的定时任务.然后第二天之后发现每天的daily reset没有被执行,一些定时任务也没有被执行.瞬间感觉整个人都不好了,怎么无端端就不执行了呢 ...

  4. DOCTYPE的详细图解

    之前有一次写代码的时候忘记写了<!DOCTYPE html> 导致样式的效果一直有点问题,查了很久才发现时候这个的锅.之后自己详细的来查找了DOCTYPE的作用. 在目前,基本上都是采用浏 ...

  5. OD使用教程12

    载入程序输入关键字: 双击进入程序 仔细看发现并没有跳转直接跳到这个mov,往上看发现retn上面有一个push,在这种编写手法当中这种组合相当于一个jmp, 跳到离它最近的一个值(在这就是004A5 ...

  6. RBAC用户权限管理数据库设计

    RBAC(Role-Based Access Control,基于角色的访问控制),就是用户通过角色与权限进行关联.简单地说,一个用户拥有若干角色,每一个角色拥有若干权限.这样,就构造成“用户-角色- ...

  7. C语言小练习一

    题目要求:国王将金币作为工资,发放给忠诚的骑士.第1天,骑士收到一枚金币:之后两天(第2天和第3天)里,每天收到两枚金币:之后三天(第4.5.6天)里,每天收到三枚金币:之后四天(第7.8.9.10天 ...

  8. 易学PHP——PHP基础知识

    PHP 语言标记 因为 PHP 是兼容当时的主流语言,所以 PHP 有四种标记方式: <?php PHP 代码 ?>.这是 PHP 最为正宗的语言标记,称为标准风格标记.XML 风格标记等 ...

  9. Sublime Text 用法小记

    复制当前行: Ctrl + Shift + D 上下移动行: Ctrl + Shift + ↑/↓ 选中行部分: Crtl + Shift + ←/→ 格式化json: Ctrl + Alt + J

  10. eclipse js 引用跳转

    引用 http://stackoverflow.com/questions/24505993/the-resource-is-not-on-the-build-path-of-a-javascript ...