汉扬编程 编程大纲 C\\C++语言9|复合(构造)数据类型:结构体和联合体

C\\C++语言9|复合(构造)数据类型:结构体和联合体

数据类型包括基本数据类型和结构数据类型:

基本数据类型:其值不可以理解为其它类型,也就是说,它是自我说明的;

构造数据类型:由若干成员或元素(基本数据类型或构造数据类型)构成的复合数据类型,分为数组类型、结构体类型、联合类型;

对于批量数据,相同类型的数据可以使用数组,如一年12个月的天数,有存储的规律性或连续性,通过数组下标体现出来(通过数组名和下标访问)。不同基本类型的批量数据可以使用结构体或联合体。另一种批量数据处理的方式是链表,在结构体中包含数据域和指针域,通过指针将单个数据连续起来。

1 结构体struct结构体,可以将多个数据集中到同一个对象,当然也是集中存储,但数据的访问通过属性(成员)名体现出来(通过结构体实例名+属性名访问)。

当我们考虑怎么逻辑地组织数据时,应该将一个人的所有信息项放在一起,即保持相关性。

一旦定义了一个结构体类型的变量,系统在分配内存时就会分配一块连续的空间,依次存放它的每一个分量。这块空间总的名字就是结构体变量的名字,内部还有各自的名字。

引入结构体可以将一组逻辑上相关的变量组合成一个有机的整体,表达更复杂的对象。

结构体类型定义是告诉C或C++这种类型的变量是如何组成的,需要多少空间。结构体变量的定义是告诉C++程序中需要存储和处理一个某结构体类型的变量,这时C++根据结构体类型的定义为这个变量分配空间。

结构体类型允许程序员把一些分量聚合成一个整体,用一个变量表示。一个结构体的各个分量都有名字,把这些分量称为成员(member)。由于结构体的成员可以是各种类型的,程序员能创建适合于问题的数据聚合。可以在定义结构体类型的同时定义指向结构体的指针或变量。

结构体类型是存储空间尺寸的描述,不会预先分配内存空间。结构体实例化的元素与对象的属性其实质也是变量,只是其隶属于某个集合而已。结构体变量名是大内存空间的地址,而元素是其中小内存空间的地址。结构是一个或多个变量的集合,该集合有一个单独的名称,便于操作。与数组不同,结构可以储存不同类型(C语言的任意数据类型,包括数组和其他结构)的变量。结构中的变量被称为结构的成员(member)。C遵循的基本的内存布局假设:通过对象的基地址和数据成员的偏移量获取数据成员的地址。

编译器会自动对齐结构体数据成员以提高运行效率。结构体的字节对齐是指编译器在为结构体变量分配内存时,保证下一个成员的偏移量为成员类型的整数倍。因此,对于一些结构体变量来说,其大小并不等于结构体中每一个成员大小的总和。

第一个成员的地址与整个结构的地址相同。

结构体中也使用构造函数:

如果不使用构造函数也是可以的,只定义一般的结构体,里面包含两个参数:

struct Node{int u,step; // u为顶点,step为源点到顶点u的最短路径};那么在变量参数赋值时,需要这样赋值:

Node vs ; //先定义一个Node结点类型变量vs.u =3 ,vs.step = 5; //分别对该变量的两个成员进行赋值采用构造函数的形式定义结构体:

struct Node{ int u,step; Node(){}; Node(int a,int sp){ u = a; //参数传递u为顶点 step = sp; //参数传递step为源点到顶点u的最短路径 }};则变量参数赋值就可以直接通过参数传递:

Node vs(3,5)上面语句等价于:

vs.v =3 ,vs.step = 5;C11允许采用(type_name){xx,xx,xx} 类似于 C++ 的构造函数的形式构造匿名的结构体。

struct test1{ int a[3],b;} foo[] = { [0].a = {1}, [1].a = 2 };复合字面量:初始化结构的时候允许对特定的元素赋值,形式为:

struct test2{int a, b, c, d;} foo2 = { .a = 1, .c = 3, 4, .b = 5 }; // 3,4 是对 .c,.d 赋值的储存一年来看过的所有电影的信息,应该用什么样的数据结构:用一个结构体存储一部电影的所有信息,用一个数组来存储看过的电影。也就是数组元素是结构体,表示电影信息。如果想储存不同用户的数据呢?数组表示用户,用数组的数组存储,最后的元素是结构体。

在C++中,结构体是纯数据的定义,如果还涉及到这些数据的操作,则更建议考虑类类型;

在结构体中使用函数指针,相当于在结构体中加入了类的成员函数。结构体和类都是对基本类型的扩展,用于提高编程的颗粒度。2 联合体Union共用体类型提供了一种机制,使得多个变量(共用体中的成员)可以共享同一个内存地址。

当定义一个共用体变量时,编译器会根据共用体成员中占用最多内存空间的变量分配空间,这样使得共用体中所有成员的都能够获得足够的空间。

联合体是一种数据格式,可以同时保存不同的数据类型,但一次只能保存一种类型,也就是保存了一种数据类型之后,对之前保存的数据类型会自动丢弃掉。也可以理解为对一块数据内存针对不同的类型进行不同的解码。

union one4all{ int int_val; long long_val; double double_val; //整个共用体根据成员中占用最多内存空间的变量分配空间};one4all pail;pail.int_val = 15; // store an intcout << pail.int_val;pail.double_val = 1.38; // store a double, int value is lostcout << pail.double_val;联合可以保存单个值,但它可以是多种类型,成员名称指示正在使用的模式。

共用体类型数据的特点:

(1) 同一个内存段可以用来存放几种不同类型的成员,但在每一瞬时只能存放其中一种,而不是同时存放几种。

(2) 共用体变量中起作用的成员是最后一次存放的成员,在存入一个新的成员后原有的成员就失去作用。

(3) 共用体变量的地址和它的各成员的地址都是同一地址。

例如,设有若干个人员的数据,其中有学生和教师。

学生:姓名、号码、性别、职业、班级。

教师:姓名、号码、性别、职业、职务。

学生和教师的数据分量只有班级和职务的差别,为此可以定义一个相同的结构体,其中用一个共用体来表示班级和职务的差别:

struct { int num; char name[10]; char sex; char job; union { int banji; char position[10]; }category; }person[2];/*先设人数为2*/-End-

本文来自网络,不代表汉扬编程立场,转载请注明出处:http://www.hyzlch.com/mianfei/6609.html

(C二维数组怎么定义)C|三种方法创建二维动态数组

Redis专题:了解Redis集群,这篇就够了

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注

返回顶部