知识点:

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. js汉语转拼音(全拼、首字母、拼音首字母)

    新建js文件first_alphabet.js // JavaScript Document // 汉字拼音首字母列表 本列表包含了20902个汉字,用于配合 ToChineseSpell //函数使 ...

  2. ViewPager循环显示

    好久没有写博客了,今天加一个ViewPager页面的循环显示,添加了一个删除页面的小按钮: MainActivity.java package com.yt.viewpagerlooper; impo ...

  3. java 多态2

    http://www.cnblogs.com/wqq0402/p/6180685.html package test05; public class DuoTai_Test02 { /**多个对象,一 ...

  4. bibnernate(2)

    2. 实例代码 新建一个java工程,假设取名为HibernateHelloWorld.在src下新那一个package,可取名为com.sun.hibernate.model 2.1 类代码 新建一 ...

  5. 在线编辑器的使用-KindEditor

    第一种:KindEditor编辑器 步骤一:加载相应的核心的文件 下载地址:http://kindeditor.net/demo.php <link rel="stylesheet&q ...

  6. RestController 和Controller的区别

    restful风格,restcontroller与controller 初步接触springmvc的时候,被要求使用restful风格,彼时一头雾水,不懂何谓restful,参阅了很多资料,慢慢的接触 ...

  7. SVN服务器的配置(简单易懂,带配置文件,有注释)

    这两天在服务器搭建了一个SVN服务器,一些经验,也留作后用把,有不详细的欢迎批评指正 另外关于子目录的访问配置,这块我还是不懂,希望有前辈能教我一下 1.安装SVN Serveryum install ...

  8. BZOJ1261: [SCOI2006]zh_tree

    Description 张老师根据自己工作的需要,设计了一种特殊的二叉搜索树.他把这种二叉树起名为zh_tree,对于具有n个结点的zh_tree,其中序遍历恰好为(1,2,3,-,n),其中数字1, ...

  9. (bzoj2330)糖果

    2330: [SCOI2011]糖果 Time Limit: 10 Sec  Memory Limit: 128 MB Description 幼儿园里有N个小朋友,lxhgww老师现在想要给这些小朋 ...

  10. redis连接超时报错

    应用程序连接redis超时,报错如下: ERROR DubboServerHandler-xxx.xx.xx.52:20880-thread-172 2016-12-21 15:25:20,429 c ...