Jialong's Blog

Do things I love, and seek happiness.

0%

FlightMuseum-GitBook

目录层级

  • Preface
  • Airbus
    • A320
      • A319
      • A320-200
      • A320-200neo
      • A321
      • ........
    • A330
      • A330-200
      • A330-300
    • A350
      • A350-900
      • A350-1000
  • Boeing
    • B737
    • B747
    • B767
    • B777
    • B787
      • B787-8 Dreamliner
      • B787-9 Dreamliner
      • B787-10 Dreamliner
  • .......
  • Trains
    • CR
    • TRA
    • JR

一个具体层级的Markdown编辑形式

1.Cathay Pacific | 国泰航空 B-LRA

国泰航空A350-900
  • Serial Number / 生产序列号:29
  • First Flight Date / 首飞日期:24th. Mar 2016 / 2016年3月24日
  • Age (Shotted Date) / 机龄(拍摄日期):3.3 years as of 27th. Jul 2019 / 3.3年 摄于2019年7月27日
  • Shotted Place / 拍摄地:Hong Kong / 香港
  • Seat Configuration / 座位布局:C38 W28 Y214
  • Engines / 引擎:2 x RR Trent XWB
  • Others:-

2.Philippines Airlines | 菲律宾航空 RP-C3506

菲律宾航空A350-900
  • Serial Number / 生产序列号:243
  • First Flight Date / 首飞日期:11st. Sep 2018 / 2018年9月11日
  • Age (Shotted Date) / 机龄(拍摄日期):0.8 years as of 9th. Aug 2019 / 0.8年 摄于2019年8月9日
  • Shotted Place / 拍摄地:Hong Kong / 香港
  • Seat Configuration / 座位布局:C30 W24 Y241
  • Engines / 引擎:2 x RR Trent XWB
  • Others:-

一、数据结构及相关概念

0. 要想知道什么是数据结构,首先要了解与“数据”相关的概念,这样才能一步步理解什么是数据结构。

我们首先用放书这件事情来举例。

  • 如果正常情况下只有你自己一个人的书,那么你把他们一本一本立起来放在书架上就可以了。
  • 那么如果有一个图书馆那么多的书应该怎样办么?总不能把他们乱起八糟的立起来放吧?那么是不是应该先按照社会科学、理科类、工科类、外语类等等的分类方式先分类,然后按照具体所属的类别把他们一个个放进去?其实数据结构的相关的概念就是一个这样简单的道理。

下面我们来进行具体的描述。

1. 数据

  • 是对客观事物的符号表示,在计算机科学中是指所有能输入到计算机中并被计算机程序处理的符号的总称。
  • 其实就对应了图书馆中的所有书

2. 数据元素

  • 数据的基本单位,在计算机程序中通常作为一个整体进行考虑号处理。
  • 对应的就是某一本具体的书,比如”数据结构与算法“这本书。

3. 数据项

  • 一个数据元素可由若干个数据项组成,数据项是数据的不可分割的最小单位。
  • 数据项不就是对应了书中的具体信息,比如书的作者、章节内容、ISBN编号等等。

4. 数据对象

  • 性质相同的数据元素的集合,是数据的子集。
  • 数据元素是一本具体的书,那么性质相同数据元素的集合不就代表了一类具体的书籍吗,就比如计算机类的书籍,其中包含了”数据机构与算法这本书“。

看到这儿是不是对这几者的关系还有点儿晕?没关系,我们用思维导图来再次说明。

数据.png

数据是由每一个具体的数据元素组成的,相同的数据元素同属于一个数据对象,每个数据元素中又有具体的信息——数据项


接下来让我们再次把这些概念对应到具体的例子”书”中。

举例_世界上所有书.png

世界上所有书就是一个数据,每一本具体的书例如“数据结构与算法”就是一个数据元素,每本书中的具体信息例如“书名、作者、ISBN码...”就是多个数据项,一些相同类型的书的类型例如“计算机类书籍”就是一个数据对象

现在你应该清楚以上4个概念了吧?

那我们回到最初的问题,什么是数据结构

这里我们同样举例子来说明。

数据对象1:计算机类书籍.png

首先,一个类别的书籍中有许多具体的书,如"C语言"、"数据结构与算法"、"编译原理",而这些书之间又有一些关联,比如某个算法可以用C语言来实现编译过程中需要用到特定的算法等等,这些存在关联的书即"数据元素"的集合就叫做数据结构

4. 数据结构

  • 相互之间存在一种或多种特定关系的数据元素的集合。

  • 大多数算法都需要我们适当地组织数据,而为了组织数据就产生了数据结构。

  • 结构

    逻辑结构

    集合

    线性结构

    树形结构

    网状结构或图状结构

    物理结构(储存结构)

    顺序储存结构

    链式储存结构

(注:这里不具体展开介绍各个数据结构,在后面的附录里进行介绍)

二、抽象数据类型

  • 指一个数学模型以及定义在该数据模型上的一组操作。

三、算法

  • 编写一段计算机程序一般都是实现一种 已有的方法来解决某个问题。这种方法大多 和使用的编程语言无关——它适用于各种计 算机以及编程语言。
  • 你要在图书馆中找到一本书,需要通过索引查找来确定这本书的位置,这个找书的过程就是一个算法。

一、指针的一些概念

1. 指针的类型

  • 把指针声明语句中的指针名字去掉,剩下的就是指针本身的类型

2. 指针所指向的类型

  • 把指针声明语句中的指针名字和名字前的指针声明符号*去掉,剩下的就是指针指向的类型

3. 指针的值——指针所指向的内存区或地址

  • 指针的值是指针本身存储的数值,该值被编译器当作一个地址(在32位程序中,所有类型的指针的值都是一个32位的整数,因为32位程序的内存地址都是32位长。)
  • 指针所指的内存区就是从指针的值所代表的内存地址开始,长度为sizeof(指针指向的类型)的一篇内存区。
  • 我们说一个指针的值是XX,就相当于说该指针指向了以XX为首地址的一片内存区
  • 同理,我们说一个指针指向了某个内存区,相当于说该指针的值是该内存区域的首地址

4. 指针本身所占据的内存区

  • sizeof(指针的类型)测试一下就知道了

二、指针的算术运算

0.指针可以加上或者减去一个整数,这种运算的意义并不是平常的数值的加减。

  • example 1
char a[20] = {0};
int *ptr = (int *)a;
ptr++;

指针ptr的类型为int*,它指向的类型为int,被初始化为指向整型变量a。

在第三句中,指针ptr被加上了1,编译器是这样进行处理的:

把指针ptr的值加上sizeof(int),在32位程序中是被加上了4,因为32位程序中int占4字节。

由于地址是用字节作为单位,所以ptr指向的地址由原来的a的地址向高的地方增加了4个地址。

char类型的长度是一个字节,所以原来的ptr是指向数组a从第0个单元开始的4个字节,现在指向了从第4个单元开始的4个字节

  • example 2

1.可以使用一个循环一个指针遍历一个数组。

int array[20] = {0};
int *ptr = array;
for (i = 0; i < 20; i++)
{
    (*ptr)++;
    ptr++;
}

该例子中将整形数组中各个单元的值都加1。同时每次循环都将指针加1个单元,所以每次循环都能访问数组的下一个单元。

  • example 4
char a[20] = "You_are_a_girl";
int *ptr = (int  *) a;
ptr += 5;

该例子中,指针ptr被加上了5个单元,编译器这样处理:

将char的值加上sizeof(int) * 5,在32位程序中即乘了4*5=20。

指针的值代表了该指针以这个值为地址指向了某个内存区,所以指针ptr所指向的地址向高地址的方向移动了20个字节

然而ptr加上5(即地址增加20个字节后)已经指向了数组a的合法范围之外,虽然应用时会出现问题,但在语法上没有问题。


2.总结

一个指针ptrold加或减一个整数n后,结果是一个新的指针ptrnew,两个指针的类型相同,指向的类型也相同。

ptrnew的值比ptrold的值增加或者减少了n * sizeof(int)个字节,即ptrnew指向的内存区比ptrold指向的内存区向高或低地址的方向移动了n * sizeof(int)个字节。

指针进行加减:两个指针不能进行加法操作,这是非法操作,结果毫无意义。两个类型相同的指针可以进行减法运算,一般在数组上应用。

三、运算符&和*

0. &是取地址运算符,*是间接运算符。

&a 运算的结果是一个指针,指针的类型是 *a,指针指向的类型是a的类型,指针指向的地址是a的地址。

*p的类型是p指向的类型,所占用的地址是p指向的地址。

四、指针表达式

0. 一个表达式的结果如果叫指针,那么这个表达式就叫指针表达式。

  • example
int a, b;
int array[10];
int *pa;
pa = &a;// &a是指针表达式
int **ptr = &pa;
*ptr = &b;
pa = array;
pa++;

1. 指针表达式的结果是一个指针,所以也具有指针的4个要素:

指针的类型

指针指向的类型

指针指向的内存区

指针自身占据的内存

2. 一个指针表达式的结果指针已经具有了自身占据的内存的时候,这个指针表达式就是一个左值,否则就不是一个左值。

五、指针和数组的关系

0. 数组的数组名可以看作是一个指针

example

int array[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, value;
value = array[0]; //or: value = *array;
value = array[3]; //or: value = *(array + 3);

总结:

声明一个数组TYPE array[n],则这个数组名有两重含义:

代表整个数组,类型是TYPE[n]。

是一个常量指针,类型是TYPE*,该指针指向的类型是TYPE,该指针的内存区就是数组的第0号单元,且该指针自己占有单独的内存区,且该指针的值不能修改,array++是错误的写法,这不代表array[1]。

六、指针和结构类型的关系

结构类型还未学习,之后补充

七、指针和函数的关系

0. 可以把一个指针声明成一个指向函数的指针。

  • example
int fun1 (char*, int);
int (*pfun1)(char*, int);
pfun1 = fun1;
int a = (*pfun1)("abcdefg", 7);//通过函数指针调用函数

可以把指针作为函数的形参。在函数表达式中,可以用指针表达式来作为实参。

八、指针类型转换

初始化一个指针或者给一个指针赋值时,赋值号左边时一个指针,右边是一个指针表达式。绝大多数情况下,指针的类型和指针表达式的类型是一样的,指针所指向的类型和表达式所指向的类型是一样的。

float f = 12.3;
float *fptr = &f;
int *p;

如果我们想让指针p指向实数f,我们应该怎样操作?

是“ p = &f; ”吗?

不对,因为左右两侧的指针和指针所指向的类型不同。所以直接赋值不行。

为了实现这个目的,需要使用强制类型转换:

p = (int*) &f;

如果一个指针p,需要把它指向的类型改为"TYPE",语法格式为:(TYPE*)p;

这样的类型转换得到一个新指针,类型为TYPE*,指向的地址就是原指针指向的地址。原来p的一切属性都没有被修改。

九、指针的安全问题