美文网首页
C++构造数据类型结构体等, since 2020-11-28

C++构造数据类型结构体等, since 2020-11-28

作者: Mc杰夫 | 来源:发表于2020-11-28 19:02 被阅读0次

(2020.11.28 Sat)
构造数据类型是根据已定义的一个或多个数据类型用构造的方法来定义的,即,一个构造类型的值可以分解为若干个成员或元素。每个成员或元素都是一个基本数据类型或构造类型。有以下几种

  • 数组类型
  • 结构体类型
  • 共用体类型
  • 枚举类型
  • 用户自定义类型数据

结构体structure

结构体类型的数据由若干称为成员的数据组成,每一个成员可以是基本数据类型的数据,也可以是构造类型的数据。
结构体是一个可以包含不同数据类型额结构,是一种可以自己定义的数据类型,和数组的差距在于

  • 结构体可以在一个结构中声明不同的数据类型
  • 相同结构的结构体变量可以互相赋值,而数据做不到
    结构体语法格式如下
struct 结构体标识符
{
    成员变量列表
}; //注意结尾有分号;

结构体的struct+标识符结构可以作为数据类型名用,比如

struct point 
{
    double x;
    double y;
    double z;
};
struct line
{
    struct point StartPoint; //前一个结构体用来定义了一个数据
    struct point EndPoint;
};
定义结构体类型变量
  1. 先定义结构体类型再单独进行变量定义
struct student
{
    int code;
    char name[20];
    char sex;
    int age;
};
struct student stu;        //定义struct student类型变量
struct student stu[20];  //定义类型数组
struct student *pstu;     //定义类型指针
  1. 紧跟在结构体类型说明之后进行定义
struct student
{
    int code;
    char name[20];
    char sex;
    int age;
}stu, stu[20], * pstu;
  1. 在说明一个无名结构体类型的同时直接进行定义
struct
{
    int code;
    char name[20];
    char sex;
    int age;
}stu, stu[20], *pstu;
  1. 使用typedef说明一个结构体类型名后再用新类型名定义变量
typedef struct
{
    int code;
    char name[20];
    char sex;
    int age;
}student;
student stu, stu[20], *pstu;
初始化结构体变量
struct student
{
    int code;
    char name[20];
    char sex;
    int age;
};
struct student stu={0917880,'Jeff Z', 'M', 26}; 
//另一种
struct student
{
    int code;
    char name[20];
    char sex;
    int age;
}stu={0917880,'Jeff Z', 'M', 26}; 
//另一种
struct
{
    int code;
    char name[20];
    char sex;
    int age;
}stu={0917880,'Jeff Z', 'M', 26}; 
//
struct
{
    int code;
    char name[20];
    char sex;
    int age;
}stu={0917880}; //只给第一个变量赋值,后面的变量由系统自动赋默认的初值 

对于最后一种情况,四个变量只有第一个赋值,后面的其他元素由系统自动赋值,char数组类型的初值为空,char类型的初值为'\0x0',int的初值为0。

引用结构体成员变量

用三种方式引用结构体变量

1. 结构体变量名.成员名 //.为成员运算符
2. 指针变量名->成员名   //->为结构指向运算符
3. (*指针变量名).成员名

一个栗子

#include<iostream.h>
struct student
{
    int code;
    char name[20];
    char sex;
    int age;
};
struct student stu={0917880,'Jeff Z', 'M', 26}; 
void main()
{
    struct student *pstu = &stu;
    cout<<stu.code<<endl;       //三种引用方式
    cout<<pstu->code<<endl;   //
    cout<<(*pstu).code<<endl;  //
}
//结构体student部分同上
void main() 
{
    struct student *pstu;
    for (pstu=stu; pstu<stu+2; pstu++) //用指针方式调用结构体内变量
    {
        cout<<pstu->code<<pstu->name<<pstu->sex<<pstu->age<<endl;
    }
}
结构体作为函数参数

一般来说,结构体作为函数参数使用的是引用传递。利用引用传递的好处很多,效率和指针相差无几,但引用的操作方式和值传递几乎一样。当结构体很大时,避免传递结构体变量很大的值,节省内存。

#include <iostream.h>
#include <string.h>
struct test
{
    char name[10];
    float score;
};
void print_score(test &p) //&符号表示引用
{
    cout<<p.name<<'\t'<<p.score<<endl;
}
void main()
{
    test a[2]={{'Jeff', 100},{'NotJeff', 90}};
    int  num = sizeof(a)/sizeof(test);   //计算数组长度
    for (int i=0;i<num;i++)
    {
    print_score(a[i]);
    }
}

共用体union

共用体类型的说明、引用方式和结构体完全相同 ,但是结构体变量中的成员各自占有自己的存储空间,而共用体变量中的所有成员占有同一个存储空间

枚举enumerate

针对集合类问题,比如比赛有输赢两个状态,一周有7天。在计算机中表述这些信息,需要定义一组整型常量,这些常量虽然表达了同一类型的信息,但是在语法上是彼此孤立的个体,不是一个完整的逻辑整体。引入枚举来表述。语法如下

enum 枚举标识符 {常量列表} //常量列表中元素之间用逗号分隔

比如

enum direction {up, down, before, back, left, right}; //列表中的元素可直接饮用
enum direction {up=1,down=2,before=3,back=4,left=5,right=6}; //赋初值

常量列表中的元素如果不赋值,则系统自动赋初值,第一个元素是0,第二个是1,以此类推。出现下面的情况

enum direction {up = 7,down=1,before,back,left,right};

系统从第一个没有设定值的常量开始,其整数常量值为前一枚举常量对应的整数常量的值+1。

#include <iostream.h>
enum direction1 {up1, down1, before1, back1, left1, right1};
enum direction2 {up2=7, down2=2, before2, back2, left2, right2};
void main()
{
    cout<<'direction1.up1='<<up1<<endl;
    cout<<'direction2.back2='<<back2<<endl'
}
定义枚举类型变量
enum direction {up, down, before, back, left, right}; 
enum direction first direction, second direction;
//或
enum direction {up, down, before, back, left, right} first direction, second direction;
引用枚举类型变量
#include <iostream.h>
enum COLORS {BLACK, BLUE, GREEN, RED};
void main()
{
    enum COLORS a,b,c;
    enum COLORS *pa;
    int d =-2;
    a=  RED;
    b = BLUE;
    c = GREEN;
    cout<<'a='<<a<<endl; //RED在enum中的默认赋值
    int e = a+b;
    if (a>b)
        pa = &a;
    else
        pa = &b;
    cout<<'*pa='<<*pa<<endl;
    cout<<'e='<<e<<endl;
}

代码的返回,a返回RED对应的默认值3,*pa返回1,e返回4。

类型重定义typedef

typedef为数据类型定义新的类型名称,从而丰富数据类型所包含的属性信息语法格式如下

typedef 类型名称 类型标识符;

其中的类型名称,为已知数据类型名称,包括基本数据类型和用户自定义数据类型。类型标识符为新的类型名称。比如

typedef double LENGTH;
typedef unsigned int COUNT;

定义之后,可以像用基本数据类型那样定义变量

LENGTH a;
COUNT b;

主要应用有如下几种形式

  1. 为基本数据类型定义新的类型名
    如前面所示
  2. 为自定义数据类型(结构体、共用体和枚举类型)定义简洁的类型名称
    比如由结构体定义
typedef struct 
{
    double x;
    int y;
    char z;
}Point; //该结构体定义为Point数据类型
Point kkk; //定义一个叫kkk的Point数据类型
  1. 为数组定义简洁的类型名称
    用typedef为长度为10的整数数组定义新的名称
typedef int INT_ARRAY_10[10];
INT_ARRAY_10 a,b,c,d; //定义了四个长度为10的整数数组
  1. 为指针定义简洁的名称
    可以为数据指针定义新的名称
tyepdef char * STRING;
STRING csname={'John'};

也可以为函数指针定义新的名称

typedef int (*myfun) (int a,int b);
int max(int a, int b);
myfun *pmyfun;
pmyfun = max;

使用typedef时,应注意以下事项

  • typedef的目的是为已知数据类型增加一个新的名称,并没有引入新的数据类型
  • typedef只适用于类型名称定义,不适合变量的定义
  • typedef和#define有相似之处但实质不同,#define是预编译处理命令,主要定义常量,此常量可以为任何的字符及其组合,在编译之前,将此常量出现的所有位置,用其代表的字符或字符组合无条件的替换,然后进行编译。

Reference

1 刘蕾编著,21天学通C++(第五版),电子工业出版社
2 聚慕课教育研发中心 编著,C++从入门到项目实践(超值版),清华大学出版社

相关文章

  • C++构造数据类型结构体等, since 2020-11-28

    (2020.11.28 Sat)构造数据类型是根据已定义的一个或多个数据类型用构造的方法来定义的,即,一个构造类型...

  • 进击的NDK03-结构体和联合体

    结构体 结构体是一种构造数据类型,把不同的数据类型整合起来成为一个自定义的数据类型 结构体的几种写法 匿名结构体 ...

  • NDK启航篇——C语言基础(结构体)

    今天来写一下结构体 什么是结构体? 结构体是一种构造数据类型把不同的数据类型整合起来成为一个自定义的数据类型 与J...

  • C++系列 --- 结构体、权限修饰符、类简介

    一、结构体 结构体:自定义的数据类型 C++ 中的结构和C中的结构有什么区别? C++中的结构除具备了C中的所有功...

  • (四)C语言之结构体

    (四)C语言之结构体 一、什么是结构体 结构体是一种构造数据类型,就是把不同的数据类型整合起来成为一个自定义的数据...

  • C语言基础03:结构体&结构体与指针

    一、什么是结构体结构体是一种构造数据类型。把不同的数据类型整合起来成为一个自定义的数据类型。关键字 struct。...

  • C 结构体 struct 共用体union

    结构体是一种构造数据类型,把不同的数据类型整合起来称为一个自定义的数据类型 结构体的写法基本写法,设置别名,匿名结...

  • 结构体、共用体与C++基础

    结构体、共用体与C++基础1 [TOC] 1、结构体 结构体是C编程中一种用户自定义的数据类型,类似于Java的J...

  • C语言 结构体,联合体,枚举

    结构体 C语言中结构体是一组构造数据类型,把不同的数据类型整合起来成为一个自定义的数据类型。如: 初始化方式 或者...

  • 结构体

    1.概念: 结构体是一种构造数据类型,把不同的数据类型整合起来成为一个自定义的数据类型 2.写法: 2.结构体指针...

网友评论

      本文标题:C++构造数据类型结构体等, since 2020-11-28

      本文链接:https://www.haomeiwen.com/subject/huhcwktx.html