知识点:

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. new与malloc

    首先将new与malloc的区别总结如下: 1 new可以自动计算需要分配多大的内存,而malloc必须指明. 2 new返回的指针是有类型的,malloc返回void*类型的指针. 3 new在分配 ...

  2. pxe无人值守安装多网卡注意事项

    pxe无人值守安装linux配置这里就不说了,直接看这篇博客http://www.cnblogs.com/mchina/p/centos-pxe-kickstart-auto-install-os.h ...

  3. MVc Forms Membership rolemanage 角色权限验证管理

    Forms  登录验证Membership 权限验证rolemanage 角色管理 以往的项目中只有单纯的Forms 验证今天想把这三个结合到mvc 中发现要导入aspnet_ 相关表,但是有个问题验 ...

  4. WPF Image控件的Source属性是一个ImageSource对象

    1.固定的图片路径是可以的,如下: <Image Source="../test.png" /> 2.绑定的Path是一个String类型的图片路径,而实际情况它需要的 ...

  5. PHP函数的实现原理及性能分析

    前言 在任何语言中,函数都是最基本的组成单元.对于php的函数,它具有哪些特点?函数调用是怎么实现的?php函数的性能如何,有什么使用建议?本文将从原理出发进行分析结合实际的性能测试尝试对这些问题进行 ...

  6. 调整static变量初始化顺序的一个办法

    // wrap the LaunchDir variable in a function to work around static/global initialization order stati ...

  7. handsontable组件和jqwidgets(jqxdragdrop组件)在一个页面产生调整宽高bug

    修改handsontable.full.js handsontable绑定的"mouseup"事件,默认是window区域太大.引起冲突.

  8. 【Mail】JavaMail介绍及发送邮件(一)

    JavaMail介绍 JavaMail是SUN提供给开发人员在应用程序中实现邮件发送和接收功能而提供的一套标准开发类库,支持常用的邮件协议,如SMTP.POP3.IMAP,开发人员使用JavaMail ...

  9. XAMARIN +VS2015 ANDROID 开发判断gps 是否打开。

    在获取位置的时候首先要判断gps是否打开,如果没有打开就要提示打开,当然最友好的就是直接调转到打开界面. LocationManager alm = (LocationManager)this.Get ...

  10. VS2013正确设置DLL环境变量目录的方法

    VS有个比较迷惑人的选项,就是在工程>>属性中有个Executable Directories设置项, 几乎所有地球人都认为这个选项是设置exe可执行文件依赖的DLL目录用的,这无疑会方便 ...