结构的本质是C语言的一种数据抽象,通俗的说,是基本数据类型的重组。

为什么要重组呢?由于基本数据类型不够用了。为什么不够用了呢?由于须要的信息类型太多了。

这是一个非常大的话题。信息本来是没有什么类型之分的,可是为了便于在计算机内部的管理,人们在C语言中把信息先分成了主要的几个类型。比方整型、浮点型、字符型、布尔型等等。可是呢,描写叙述一个事物的所有信息有时候仅用一种基本类型是不够的,比方一本书的基本属性:作者(字符型)、价格(浮点型)、出版日期(我也不知道什么型)、书名(字符型)。

然而操蛋的是,我们要处理的并不是是这本书的某个属性,而是总体,这时候我们仅仅好把各种类型组合起来构造一种全新的数据类型——这正是发挥我们想象力和创造力的时候。

除了基本类型以外并由其组合而成的新类型统称为结构体。

1、在C语言中。要创造一个全新的数据类型,首先要定义这么一个类型。告诉编译器这个新类型由哪些基本类型组成。标准的定义形式例如以下: 

struct book

{

    int price;

    char title[44];

};

首先是keywordstruct。表明这不是一个基本类型;然后是一个标记(tag),相当于给新类型起的名字。可是这个名字并不是必须的,以下会谈到为什么写上比較好。最后是新类型的成员,须要放在花括号中面且表明基本数据类型。须要注意的是。末尾须要加上分号,由于这仅仅是类型定义,属于一种声明,声明都要以分号结尾。类型定义并不分配内存空间。他仅仅是创造了一个模版。以后用这个模版定义变量的时候才真正的分配内存。

2、定义结构体变量

有了类型就能够定义变量。如:

struct book 

{

    int price;

    char title[44];

} a, b;

a和b被定义为struct book类型的变量,然后依照模版分配内存空间。

也能够这样定义变量:

struct

{

    int price;

    char title[44];

} a; 



以上两张形式的定义差别在于:一个有tag一个没有。

但不管哪一种都略显臃肿,尤其是成员众多的时候。

这时。tag的作用就显示出来了,我们能够简化定义的形式:

struct book a, b;

注意struct不能省略,tag必须和struct一起使用,才干相当于int、float等基本类型。而没有tag直接定义变量的形式就不能享受这样的便利了。

并且tag的作用并不是仅限于简化定义形式。实际上,仅仅有定义了tag,这个模版(新类型)才干够被重复使用(即定义变量)而不引起混淆。

像以下这样:

struct

{

    int price;

    char title[44];

} a; 





struct

{

    int price;

    char title[44];

} *b; 





要注意两个结构体是不同的。至少在编译器眼里是不同的,即使他们的成员一样。比方 b = &a; 这是非法的。而有了tag就能够避免这种混淆——tag能够把成员同样的结构默觉得同一种类型。

另外,不加tag的形式仅仅能在定义变量的时候使用,换言之,以下的类型定义(声明)是没有意义的:

struct

{

    int price;

    char title[44];

};

3、初始化

能够这样:

struct book a = {43.5, "agv"};

成员之间用逗号隔开,同一时候成员顺序要和模版保持一致,即类型要匹配。

假设成员比模版声明的要多就会报错;假设少于模版数量,未指定值的项目会被置为0或空。多余的逗号不会报错。

也能够这样:

struct book a = {.title = "agv", .price = 43.5};

这样的形式就不必依照模版的顺序赋值。可是要注意一点。假设这样:

struct book a = {.title = "agv", .price = 23.1, "ree"};

那么最后title的值究竟是多少?答案是“ree”。先前的会被后来的覆盖。由于title的确是在price之后的,price赋值后非常自然的继续给title赋值。

初始化的时候。若结构体变量是全局变量,则必须使用常量表达式初始化成员;若结构体是局部变量。则能够是变量表达式初始化成员。

4、赋值

赋值和初始化是不同的(多么痛的领悟啊)!

。!!!

结构体基本上没有赋值这一说,比方以下的做法是错的:

struct book a;

a = {.title = "agv", .price = 43.5};

数组也是这么规定的。可是结构体变量之间能够相互赋值。比方:

struct book a。b;

a = b;

只是仅限于局部变量。

可是,我们能够对结构体的各个成员分别赋值,就像普通变量那样:

a.title = "agv";

a.price = 43.5;

5、訪问成员变量

两个符号: . 和 ->。组合起来有三种方式。

struct book a;

printf("a.title\n");





struct book *b;

b = &a;

printf("b->title\n");





struct book *b;

b = &a;

printf("(*b).title\n");





这里显然有b->title == a.title,仅仅只是->专门用于指针,而.用于结构变量本身罢了。

基本内容就这么多了。以后会继续补充。

C语言笔记之结构体的更多相关文章

  1. C语言笔记(结构体与offsetof、container_of之前的关系)

    关于结构体学习,需要了解:结构体的定义和使用.内存对齐.结构体指针.得到结构体元素的偏移量(offsetof宏实现) 一.复习结构体的基本定义和使用 typedef struct mystruct { ...

  2. C语言中的结构体,结构体数组

    C语言中的结构体是一个小难点,下面我们详细来讲一下:至于什么是结构体,结构体为什么会产生,我就不说了,原因很简单,但是要注意到是结构体也是连续存储的,但要注意的是结构体里面类型各异,所以必然会产生内存 ...

  3. Go语言基础之结构体

    Go语言基础之结构体 Go语言中没有“类”的概念,也不支持“类”的继承等面向对象的概念.Go语言中通过结构体的内嵌再配合接口比面向对象具有更高的扩展性和灵活性. 类型别名和自定义类型 自定义类型 在G ...

  4. 4-17疑难点 c语言之【结构体对齐】

    今天学习了结构体这一章节,了解到了结构体在分配内存的时候采取的是对齐的方式 例如: #include<stdio.h> struct test1 { int a; char b; shor ...

  5. C语言第九讲,结构体

    C语言第九讲,结构体 一丶结构体的定义 在C语言中,可以使用结构体(Struct)来存放一组不同类型的数据.结构体的定义形式为: struct 结构体名{ 结构体所包含的变量或数组 }; 结构体是一种 ...

  6. C 语言实例 - 使用结构体(struct)

    C 语言实例 - 使用结构体(struct) C 语言实例 C 语言实例 使用结构体(struct)存储学生信息. 实例 #include <stdio.h> struct student ...

  7. Verilog缺少一个复合数据类型,如C语言中的结构体

    https://mp.weixin.qq.com/s/_9UsgUQv-MfLe8nS938cfQ Verilog中的数据类型(Data Type)是分散的,缺少一个复合数据类型:把多个wire, r ...

  8. GO学习-(13) Go语言基础之结构体

    Go语言基础之结构体 Go语言中没有"类"的概念,也不支持"类"的继承等面向对象的概念.Go语言中通过结构体的内嵌再配合接口比面向对象具有更高的扩展性和灵活性. ...

  9. 【学习笔记】【C语言】指向结构体的指针

    1.指向结构体的指针的定义 struct Student *p;  2.利用指针访问结构体的成员 1> (*p).成员名称 2> p->成员名称 3.代码 #include < ...

随机推荐

  1. Shell脚本笔记

      如何查询文件里的某个字符串? grep “字符串” 文件 例:grep "abc" tmp.txt   如何将查询出来的内容赋给变量? str=$(grep "abc ...

  2. java.lang.ClassNotFoundException与java.lang.NoClassDefFoundError的区别(转)

    ClassNotFoundException ClassNotFoundException这个错误,比较常见也好理解. 原因:就是找不到指定的class. 常见的场景就是: 1 调用class的for ...

  3. package、import、java及javac的相关介绍(转)

    Package: package中所存放的文件 所有文件,不过一般分一下就分这三种 1.java程序源文件,扩展名为.java: 2.编译好的java类文件,扩展名为.class: 3.其他文件,也称 ...

  4. SDUT 2893-B(DP || 记忆化搜索)

    B Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描写叙述 有n块地板排成一条直线,从左到右编号为1,2,3. . . n-1,n,每 ...

  5. QSettings操作配置文件

    用Qt写界面时,难免会进行本地信息的保存,可以使用轻量级数据库sqlite,也可以使用QSettings读写配置文件.     如何来进行读写呢?如下,使用QSettings写一个通用的读写方法:   ...

  6. windows lwp 乱码问题

    use LWP::UserAgent; use Encode; my $ua = LWP::UserAgent->new; $phone=$ARGV[0]; $cc=$ARGV[1]; $ua- ...

  7. Qt学习经验之quit()、exit()、close()《转载》

       使用QT编辑界面,其中带来很大方便的一点就是Qt中自带丰富的.种类齐全的类及其功能函数,程序员可以在编辑程序的过程中简单地直接调用.关于窗口关闭的操作,在这里指出常用的三个槽,即quit(),e ...

  8. cocos2d-x游戏开发系列教程-编译运行我们的第一个cocos2d-x游戏程序

    环境准备和介绍: 操作系统:64位Windows 7 sp1(Microsoft Windows [版本 6.1.7601]) 必要的软件和源码: visual_studio_ultimate_201 ...

  9. boost计算随机数和计算crc32简单示例

    boost计算随机数和计算crc32简单示例 - jwybobo2007的专栏 - 博客频道 - CSDN.NET boost计算随机数和计算crc32简单示例 2013-02-18 17:14 10 ...

  10. Ruby on Rails 實戰聖經阅读(二)

    1.操作系统 centos5.4 2.安装ruby yum install ruby 会安装得到 1.8.5 如果你公司用的是1.8.X就无所谓了, 拿这个学习就行了 如果你们公司用的是1.9.X,那 ...