一个数据结构是组合到同一定义下的一组不同类型的数据,各个数据类型的长度可能不同。它的形式是:

struct model_name {
type1 element1;
type2 element2;
type3 element3;
.
.
} object_name;

这里model_name 是一个这个结构类型的模块名称。object_name 为可选参数,是一个或多个具体结构对象的标识。在花括号{ }内是组成这一结构的各个元素的类型和子标识。

如果结构的定义包括参数model_name (可选),该参数即成为一个与该结构等价的有效的类型名称。例如:

struct products {
char name [30];
float price;
};
products apple; 
products orange, melon;

我们首先定义了结构模块products,它包含两个域:name 和 price,每一个域是不同的数据类型。然后我们用这个结构类型的名称 (products) 来声明了 3个该类型的对象:apple, orange 和melon。

一旦被定义,products就成为一个新的有效数据类型名称,可以像其他基本数据类型,如int, char或 short 一样,被用来声明该数据类型的对象(object)变量。

在结构定义的结尾可以加可选项object_name ,它的作用是直接声明该结构类型的对象。例如,我们也可以这样声明结构对象apple, orange和melon:

struct products {
char name [30];
float price;
}apple, orange, melon;

并且,像上面的例子中如果我们在定义结构的同时声明结构的对象,参数model_name (这个例子中的products)将变为可选项。但是如果没有model_name,我们将不能在后面的程序中用它来声明更多此类结构的对象。

清楚地区分结构模型model和它的对象的概念是很重要的。参考我们对变量所使用的术语,模型model 是一个类型type,而对象object 是变量variable。我们可以从同一个模型model (type)实例化出很多对象objects (variables)。

在我们声明了确定结构模型的3个对象(apple, orange 和 melon)之后,我们就可以对它们的各个域(field)进行操作,这通过在对象名和域名之间插入符号点(.)来实现。例如,我们可以像使用一般的标准变量一样对下面的元素进行操作:

apple.name
apple.price
orange.name
orange.price
melon.name
melon.price

它们每一个都有对应的数据类型:apple.name, orange.name 和melon.name 是字符数组类型char[30],而apple.price, orange.price 和 melon.price 是浮点型float。

下面我们看另一个关于电影的例子:

// example about structures
#include ‹iostream.h›
#include ‹string.h›
#include ‹stdlib.h›

struct movies_t {
char title [50];
int year;
}mine, yours;

void printmovie (movies_t movie);

int main () {
char buffer [50];
strcpy (mine.title, "2001 A Space Odyssey");
mine.year = 1968;
cout << "Enter title: ";
cin.getline (yours.title,50);
cout << "Enter year: ";
cin.getline (buffer,50);
yours.year = atoi (buffer);
cout << "My favourite movie is:\n ";
printmovie (mine);
cout << "And yours:\n";
printmovie (yours);
return 0;
}

void printmovie (movies_t movie) {
cout << movie.title;
cout << " (" << movie.year << ")\n";
}

Enter title: Alien
Enter year: 1979
My favourite movie is:
2001 A Space Odyssey (1968)
And yours:
Alien (1979)

这个例子中我们可以看到如何像使用普通变量一样使用一个结构的元素及其本身。例如,yours.year 是一个整型数据int,而 mine.title 是一个长度为50的字符数组。

注意这里 mine 和 yours 也是变量,他们是movies_t 类型的变量,被传递给函数printmovie()。因此,结构的重要优点之一就是我们既可以单独引用它的元素,也可以引用整个结构数据块。

结构经常被用来建立数据库,特别是当我们考虑结构数组的时候。

// array of structures
#include ‹iostream.h›
#include ‹stdlib.h›

#define N_MOVIES 5

struct movies_t {
char title [50];
int year;
} films [N_MOVIES];

void printmovie (movies_t movie);

int main () {
char buffer [50];
int n;
for (n=0; n<N_MOVIES; n++) {
cout << "Enter title: ";
cin.getline (films[n].title,50);
cout << "Enter year: ";
cin.getline (buffer,50);
films[n].year = atoi (buffer);
}

cout << "\nYou have entered these movies:\n";
for (n=0; n<N_MOVIES; n++) {
printmovie (films[n]);
return 0;
}

void printmovie (movies_t movie) {
cout << movie.title;
cout << " (" << movie.year << ")\n";
}

Enter title: Alien
Enter year: 1979
Enter title: Blade Runner
Enter year: 1982
Enter title: Matrix
Enter year: 1999
Enter title: Rear Window
Enter year: 1954
Enter title: Taxi Driver
Enter year: 1975

You have entered these movies:
Alien (1979)
Blade Runner (1982)
Matrix (1999)
Rear Window (1954)
Taxi Driver (1975)

结构指针(Pointers to structures)

就像其它数据类型一样,结构也可以有指针。其规则同其它基本数据类型一样:指针必须被声明为一个指向结构的指针:

struct movies_t {
char title [50];
int year;
};
movies_t amovie;
movies_t * pmovie;

这里 amovie 是一个结构类型movies_t 的对象,而pmovie 是一个指向结构类型movies_t 的对象的指针。所以,同基本数据类型一样,以下表达式正确的:

pmovie = &amovie;

下面让我们看另一个例子,它将引入一种新的操作符:

// pointers to structures
#include ‹iostream.h›
#include ‹stdlib.h›

struct movies_t {
char title [50];
int year;
};

int main () {
char buffer[50];

movies_t amovie;
movies_t * pmovie;
pmovie = & amovie;

cout << "Enter title: ";
cin.getline (pmovie->title,50);
cout << "Enter year: ";

cin.getline (buffer,50);
pmovie->year = atoi (buffer);

cout << "\nYou have entered:\n";
cout << pmovie->title;
cout << " (" << pmovie->year << ")\n";

return 0;
}

Enter title: Matrix
Enter year: 1999

You have entered:
Matrix (1999)

上面的代码中引入了一个重要的操作符:->。这是一个引用操作符,常与结构或类的指针一起使用,以便引用其中的成员元素,这样就避免使用很多括号。例如,我们用:

pmovie->title

来代替:

(*pmovie).title

以上两种表达式pmovie->title 和 (*pmovie).title 都是合法的,都表示取指针pmovie 所指向的结构其元素title 的值。我们要清楚将它和以下表达区分开:

*pmovie.title

它相当于

*(pmovie.title)

表示取结构pmovie 的元素title 作为指针所指向的值,这个表达式在本例中没有意义,因为title本身不是指针类型。

下表中总结了指针和结构组成的各种可能的组合:

表达式 描述 等价于
pmovie.title 结构pmovie 的元素title  
pmovie->title 指针pmovie 所指向的结构其元素title 的值 (*pmovie).title
*pmovie.title 结构pmovie 的元素title 作为指针所指向的值 *(pmovie.title)

结构嵌套(Nesting structures)

结构可以嵌套使用,即一个结构的元素本身又可以是另一个结构类型。例如:

struct movies_t {
char title [50];
int year;
}

struct friends_t {
char name [50];
char email [50];
movies_t favourite_movie;
} charlie, maria;

friends_t * pfriends = &charlie;

因此,在有以上声明之后,我们可以使用下面的表达式:

charlie.name
maria.favourite_movie.title
charlie.favourite_movie.year
pfriends->favourite_movie.year

(以上最后两个表达式等价)

C++ 高级数据类型(五)—— 数据结构相关推荐

  1. python之Rich库使用入门(打印彩色字体,表单,进度条与状态动画,高级数据类型)

    文章目录 前言 一.Rich是什么? 二.安装与导入Rich 1.Rich安装 2.导入rich库(快速使用打印功能) 三.Console类的使用 1.官方推荐的构造与导入方式 2.Console的构 ...

  2. C 语言编程 — 高级数据类型 — 结构体与位域

    目录 文章目录 目录 前文列表 结构体 定义结构体 初始化结构体变量 访问结构体成员 结构体的内存分布 将结构体作为实参传入函数 指向结构体变量的指针 位域 定义位域 使用位域结构体的成员 前文列表 ...

  3. 数据类型_分享redis中除5种基础数据类型以外的高级数据类型

    众所周知,在redis中的数据类型有String(字符串).hash(哈希).list(列表).set(集合).zset(有序集合)五种.但在这5种之外还有高级数据类型. 今天和大家介绍下常用的高级数 ...

  4. Power Query|M函数:数据类型及数据结构

    转载自微信 前言: 查询增强版(Power Query)是Excel Power BI组件中用于数据导入.数据整合以及数据处理的插件工具.适用于Excel 2010以上版本,在Excel 2010以及 ...

  5. Python数据类型与数据结构简单整理(未完成)

    Python数据类型与数据结构简单整理 数据类型 数值型 int float 字符型 单字符 字符串 字符串前缀 格式化输出 方式一 方式二 方式三 print()函数 格式 参数介绍 参数实例 作用 ...

  6. 高级OS(五) - 进程的创建和调度

    高级OS(五) - 进程的创建和调度 一.题目 二.解答 1.进程从诞生到结束,是一个生命周期,在这个生命周期中,进程的创建至关重要,请分析进程的生命周期,并深入到内核源代码对fork进行分析** ( ...

  7. python逻辑型数据也叫什么_Python的数据类型与数据结构

    对Python的数据类型与数据结构进行的复习,基本的数据类型与数据结构都已经概况出了.大家可以参考学习.如有有错误的地方,希望留言告诉我. 数据类型 Python 数据主要分为: 整数型 :数字的整数 ...

  8. C 语言编程 — 高级数据类型 — void 类型

    目录 文章目录 目录 前文列表 void 类型 前文列表 <程序编译流程与 GCC 编译器> <C 语言编程 - 基本语法> <C 语言编程 - 基本数据类型> & ...

  9. C 语言编程 — 高级数据类型 — 字符串

    目录 文章目录 目录 前文列表 字符串 字符串拷贝 字符串比较 strcmp strncmp 前文列表 <程序编译流程与 GCC 编译器> <C 语言编程 - 基本语法> &l ...

  10. C 语言编程 — 高级数据类型 — 共用体

    目录 文章目录 目录 前文列表 共用体 定义共用体 访问共用体成员 前文列表 <程序编译流程与 GCC 编译器> <C 语言编程 - 基本语法> <C 语言编程 - 基本 ...

最新文章

  1. p8工程师告诉你软件测试的三大误区,你误了几个?
  2. html显示任务进度,(原创)asp.net利用多线程执行长时间的任务,客户端显示出任务的执行进度的示例(二)...
  3. 在linux中安装软件会出的问题,linux中安装程序出现的问题
  4. 重磅!微软发布 vscode.dev,把 VSCode 带入浏览器!
  5. python Tags 母板 组件 静态文件相关 自定义simpletag inclusion_tag
  6. php pdo更新,php - 使用PDO和MySQL更新查询
  7. jquery.autocomplete自动补齐和自定义格式
  8. FT1248开发笔记
  9. java常用string inputStream转换
  10. 《TCP/IP路由技术(第二卷)》一1.5 检测与排除EGP故障
  11. Flash Player离线安装包下载指南
  12. 青龙面板之运行脚本文件
  13. [解决方法]shc -f xxx.sh shc: invalid first line in script
  14. 详细设计的工具——盒图(N-S图)
  15. vue中图片解析失败
  16. ubuntu18 防火墙关闭_ubuntu18开启/关闭防火墙
  17. oracle一次提交大量sql语句 begin end的使用
  18. canvas-随机粒子特效
  19. 【网络攻防技术】实验四——缓冲区溢出攻击实验
  20. WEB前端优化之内容篇

热门文章

  1. Selenium2Library+ride学习笔记
  2. UVa 10026 - Shoemaker's Problem
  3. 计算机真正管理的文件名是什么,计算机题,请大家多多帮忙,谢谢
  4. leetcode 697. 数组的度(hashmap)
  5. leetcode 1208. 尽可能使字符串相等(滑动窗口)
  6. leetcode103. 二叉树的锯齿形层次遍历(bfs)
  7. 上海区块链会议演讲ppt_所以您想参加会议演讲吗? 这是我的建议。
  8. robot:截图关键字
  9. Spring入门篇——第6章 Spring AOP的API介绍
  10. 模糊查询一--视图写sql