zoukankan      html  css  js  c++  java
  • 自定义数据类型 C++ 结构体类型 共同体类型 枚举类型 类类型{}

    一。结构体类型

         结构体类型,共用体类型,枚举类型,类类型等统称为自定义类型(user-defined-type,UDT)。

         结构体相当于其他高级语言中的记录(record);例如:

         struct Student{

               int num;

               char name[20];

               char sex;

               int agel

               float score;

               char addr[30];

        };

        结构体声明的一般形式:

        struct 结构体类型名 {成员列表};

        结构体类型名用作结构体类型的标志,上面的Student就是结构体类型名。上例中num,name等都称为结构体中的成员。在声明一个结构体类型时必须对各成员都进行类型声明,即:  类型名     成员名;   每个成员称为结构体中的一个成员列表又称为域表

        注意:C语言中,结构体的成员只能是数据(就如上面的例子一样);C++中则对此进行了扩充,结构体的成员可以包括数据,可以包括函数(成员函数),以适应面向对象的程序设计。

    二。结构体类型定义的方法和初始化

         1.定义结构体类型变量的方法有一下三种:

           (1)先声明结构体类型,再定义变量名。

                 如上面已经定义了一个结构体类型Student,可以使用它来定义结构体变量。如

                 Student student1,student2;

            结构体变量定义之后,系统会为之分配内存单元。

            C语言中,定义结构体变量时,要在结构体类型名前面加上关键字struct,C++保留了C的用法。如:struct Student student1,student2;

           (2)在声明变量时,同时定义。

                  struct Student

                  {

                      int num;

                      char name[20];

                       int sex;

                       float score;

                       char addr[30];

                    }student1,student2;

                    这种定义的形式为:

                    struct 结构体名

                   {

                          成员列表

                    }变量列表;

           (3)直接定义结构体变量类型,期一般形式:

                  struct

                  {

                        成员列表

                   }变量名列表;

                  记住:在编译时,是不会为类型分配空间的,只是为变量分配空间。在结构体中的成员名可以与程序中的变量名相同,但是两者没有必然联系。例如,                        在程序中可以定义一个整型变量num,它与student中的num是两回事,互不影响。              

         2.结构体变量的初始化。

            struct Student

            {

                  int num;

                  char name[20];

                  char sex;

                  int age;

                  float score;

                  char addr[30];

             }student1={10001,"wangjiun","M",19,90.5,"sahgnhai"};

             也可以将声明和定义类型分开,在定义变量时进行初始化。如

             Student student1={10002,"chengong",'f',20,98,"Beijing"};//Student是已经声明的结构体类型;

         3.结构体变量的引用。

            引用结构体变量中成员的一般方式:    结构体变量名.成员名称;   如,student1.num=10001;

            "."是成员运算符。它在所有的运算符中优先级最高。因此可以将student1.num当做一个整体看。

         4.结构体数组

           结构体数组与数值数组不同之处:每个数组元素都是一个结构体类型的数据,她们都包括各个成员项

           定义结构体数组:和定义结构体变量的方法相仿,定义结构体数组时只需声明其为数组即可。

           struct Student

           {

                int num;

                char name[20];

                int age;

                float score;

                char addr[30];

           };

           Student stu[3];//定义Student类型的数组stu

           也可以直接定义一个结构体数组。如:

           struct Student

           {

                int num;

                char name[20];

                char sex;

                int age;

                float score;

                char addr[30];

            }stu[3];

            或者:

            

    struct 

           {

                int num;

                char name[20];

                char sex;

                int age;

                float score;

                char addr[30];

            }stu[3];

            结构体初始化:结构体初始化与其他数组一样,对结构体数组可以初始化。

            struct Student

           {

                int num;

                char name[20];

                char sex;

                int age;

                float score;

                char addr[30];

             }stu[3]={{1001,"linlin",'M',18,98.4,"Beijing"},{1002,"lijun",'F',18,98.4,"Beijing"},{1001,"wangxiajian",'M',18,90,"Shanghai"}};

             定义数组stu时,也可以不指定元素个数,即可以写成:

             stu[]={{...},{...},{...}};编译时,系统会根剧初始值的结构体常量的个数来确定数组元素的个数。

    三。指向结构体变量的指针

          一个结构体变量的指针就是该变量所占的内存段的起始地址。

         可以设置一个指针变量来指向结构体变量,此时该指针变量的值就是结构体变量的起始地址。指针变量也可以用来指向结构体数组中的元素。

         1.通过指向结构体变量的指针引用结构体变量中的成员

           #include <iostream>

           #include <string>

           using namespace std;
           struct gjjou
            {
                    int num;
                    string name;
                    char sex;
                    float score;
            };
           int main()
           {

                    gjjou stu;
                    gjjou *p=&stu;
                    stu.num=103001;
                    stu.name="wangjingjing";
                    stu.sex='F';
                    stu.score=9.9;
                    cout<<(*p).num<<" "<<(*p).name<<" "<<(*p).sex<<" "<<(*p).score<<" "<<endl;
                    cout<<stu.name<<" "<<stu.num<<" "<<stu.sex<<" "<<stu.score<<" "<<endl;
                    return 0;
             }

            为了使用直观,C++提供了指向结构体变量的运算符”->“,例如,p->num表示指针p当前指向的结构体变量中的成员num。p->和(*p).num等价。以下           三种形式等价:

                  1.结构体.成员名。     如,stu.num;

                  2.(*p).成员名。   如,(*p).num;

                  3.p->成员名。      如p->num。”->“称为指向运算符。

              注意:

                    p->n                     得到p指向的结构体变量中的成员n的值。

                    p->n++                 得到p指向的结构体变量中的成员n的值,用完该值后使它加1.

                    ++p->n                 得到p指向的结构体变量中成员n的值,并使之加1,然后再使用它。

         2.用结构体变量和指向结构体变量的指针构成链表。

         3.结构体类型数据作为函数参数。

           (1)用指向结构体变量的指针作为实参,将结构体变量的地址传递给形参

           (2)将结构体变量的引用变量作为函数参数。

    四。动态分配和撤销内存的运算符new和delete

          1.对动态链表中的节点的插入与删除,C语言中利用库函数malloc和free来分配和撤销内存空间。C++提供了运算符new和delete来取代malloc和delete。

          注意:new和delete是运算符。不是函数。

             new  int;//开辟一个存储空间,返回一个指向该空间的地址。

             new  int(100);//开辟一个存放整数的空间,并指定该整数的初值为100,返回一个指向该存储空间的地址

             new  char[10]; //开辟一个存放字符数组的空间(包括10个元素),返回首地址。

             new  int[5][4];  //开辟一个存放二维整型数组(大小为5*4)的空间,返回首元素的地址。

             float *p=new float(3.141592); //开辟一个存放单精度的空间,并指定该实数的初值为3.141593,将返回的该空间地址赋给指针变量p;

            new运算符使用的一般格式:

                    new  类型[初值];

            注意:用new分配数组空间时不能指定初值。如果由于内存不足等原因而无法正常分配空间,new会返回一个空指针NULL;用户可以根据该指针的值判断分配空间是否成功。

                   delete  []  指针变量

           前面撤销new开辟的存放单精度的空间,应该用 delete p;

           前面用"new char[10];"开辟的字符数组空间,如果把new返回的指针赋给了指针变量pt,则应该以下面的形式撤销空间:delete  [] pt;

  • 相关阅读:
    vue 进行ajax请求,使用axios
    webpack 小记
    js闭包
    git小记
    sublime text3 插件安装
    mysql安装
    四十九、django单表操作,多表操作,一对多,多对多,分组查询,聚合查询,F、Q查询,自定义char字段,事务,only与defer ,choices字段
    四十八、模板层,标签,过滤器,继承和导入
    四十七、django路由匹配,分组,反向解析,路由分发,视图层
    四十六、django配置及增删改查
  • 原文地址:https://www.cnblogs.com/NongSi-Net/p/4249701.html
Copyright © 2011-2022 走看看