zoukankan      html  css  js  c++  java
  • C语言笔记之结构体

            结构的本质是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 ");


    struct book *b;
    b = &a;
    printf("b->title ");


    struct book *b;
    b = &a;
    printf("(*b).title ");


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




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

  • 相关阅读:
    MVC3、如何应用EntityFramework 连接MySql 数据库 Kevin
    DEV EXPRESS Summary Footer 不显示 Kevin
    装饰模式 Kevin
    Dev 控件 GridControl 控件 二次绑定数据源的问题。 Kevin
    System.InvalidOperationException 异常 Kevin
    LINQ to XML Kevin
    代理模式——代码版“吊丝的故事” Kevin
    VS2012 中的设备 面板 Kevin
    maven 学习笔记(三)创建一个较复杂的 eclipse+android+maven 工程
    maven 学习笔记(一)eclipse+android+maven
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/5101042.html
Copyright © 2011-2022 走看看