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;

  • 相关阅读:
    Data Base mysql备份与恢复
    java 乱码问题解决方案
    【知识强化】第二章 物理层 2.1 通信基础
    【知识强化】第二章 进程管理 2.2 处理机调度
    【知识强化】第二章 进程管理 2.1 进程与线程
    【知识强化】第一章 操作系统概述 1.3 操作系统的运行环境
    【知识强化】第一章 网络体系结构 1.1 数据结构的基本概念
    【知识强化】第一章 网络体系结构 1.2 计算机网络体系结构与参考模型
    【知识强化】第一章 网络体系结构 1.1 计算机网络概述
    【知识强化】第一章 操作系统概述 1.1 操作系统的基本概念
  • 原文地址:https://www.cnblogs.com/NongSi-Net/p/4249701.html
Copyright © 2011-2022 走看看