求职宝典 第一章 数组

来源:互联网 发布:千牛工作台mac版下载 编辑:程序博客网 时间:2024/05/16 10:19

1.一维数组的声明与字符数组

一维数组的声明:

一维数组的声明应注意以下几点

1)存储在每个元素中值的类型

2)数组名

3)数组中的元素数必须用值大于等于1的常量表达式定义

数组中的类型不能是引用,即没有引用数组,这是因为引用数不能赋值的,而数组中的元素必须可以被赋值。虽然没有引用数组,但数组可以有引用。

一维数组的初始化:

数组元素初始化时,若没有显示提供元素初值,则元素会像普通变量一样初始化:

1)函数体外定义的内置类型数组(即内置类型的全局数组),元素初始化为0

2)函数体内定义的内置类型数组,元素无初始化。

3)如果不是内置类型,则不管在哪里定义,自动调用其默认构造函数为其初始化,若该类无默认构造函数则会报错。

 

C风格的字符串与字符数组:

C风格字符串包括两种

1)字符串常量。双引号括起来的字符序列为字符串常量,为了兼容C语言,C++中所有的字符串常量都由编译器自动在其末尾添加一个空字符(NULL)。

2)末尾添加了’\0’的字符数组

可见,C风格字符串末尾必须有一个字符’\0’(NULL);

 

字符数组

方式1

Char Ca1[] = {‘C’, ‘+’, ‘+’}; //末尾没有null字符

Char ca2[] = {‘C’,  ‘+’,  ‘+’,  ‘\0’}; //末尾显示添加null字符

方式2

Char ca3[] = “C++”;  //末尾自动添加null字符

 

2.二维数组

二维数组的声明与初始化

二维数组的初始化分为两种,一种是按行初始化,程序员可以使用由花括号括起来的初始化列表来初始化多维数组的元素,对于多维数组的每一行,可以在用花括号指定其元素初始化形式。另一种是顺序初始化。

C++规定,在声明和初始化一个二维数组时,如果对二维数组的所有元素都赋值,则第一维行数可以省去。如:

Int array[][3] = {1, 2, 3, 4, 5, 6};

 

行优先存储与列优先存储

C/C++中,二维数组是按行优先顺序存储的,二维数组的行优先存储是指在内存中,先将二维数组的第一行按顺序存储,接着就是第二行数据,接着是第三行数据...

一个二维数组元素a[x][y]在一维数组b中,是a[x][y] = b[x*列数+ y]

二维数组的动态声明

3.数组指针 指针数组 与 数组名 的指针操作

指针运算 ----- 算数运算、关系运算

合法的指针运算包括以下几种:指针与整数的加减(包括指针自增与自减)、同类型指针间的比较、同类型的两指针相减

算数运算:

C的指针算数运算只限于两种形式,第一种形式是: 指针+/-整数,这种形式用于指向数组中某个元素的指针,其类表达式的结果也是一个指针。当一个指针和一个整数进行算数运算时,整数在执行加法运算前始终会根据合适的大小进行调整,这个合适的大小就是指针所指向类型的大小。第二种形式是: 指针-指针,只有当两个指针都指向同一个数组中的元素时,才允许一个指针减去另一个指针,减法运算的值是两个指针在内存中的距离(以数组元素的长度为单位,而不是以字节为单位),如果两个指针所指向的不是同一个字节中的元素,他们之间相减的结果是未定义的。

关系运算:

还可以进行<, <=, >, >= 运算,不过前提是他们都是指向同一个数组中的元素,根据你所使用的操作符,比较表达式将告诉你哪个指针指向数组中更前或更后的元素。

 

指针数组与数组指针

所谓指针数组,是指一个数组里面装着指针,也即指针数组是一个数组,一个有10个指针的数组,其中每个指针是指向一个整型数,那么此数组的定义为:int * a[10];

所谓数组指针,是一个指向数组的指针,它其实还是指针,只不过指向整个数组,一个指向有10个元素整形数组的指针的定义为:int*p[10];其中,由于[]号的优先级高于*,所以必须添加 (*p.

二维数组的数组名是一个数组指针,若有int w[3][4]pw是与数组名等价的数组指针,则pw的初始化语句为int *(pw)[4] = w

 

 

指针运算在数组中的应用

指针运算在一维数组中的应用

    指针和数组密切相关,特别是在表达式中使用数组名时,该名字会自动转换为指向数组首元素(第0个元素)的指针。但需注意数组首地址是常量,不可进行赋值操作。

当数组作为函数参数传递时,传递给函数的是数组首元素的地址,而将数组某一个元素的地址当做实参时,传递的是此元素的地址,这是可以理解为传递的是子数组(以此元素为首元素的子数组)首元素的地址。

指针运算在高维数组中的应用

事实上,C++没有提供高维数组类型。以二维数组为例,用户创建的二维数组其实是每个元素本身都是数组的数组。

例如这样的数组声明:  int a[4][5];

&a表示数组的首地址,则有

// a: 类型为 int(*)[5],为二维数组首地址,且为常量,不可被赋值,a+i的类型也为 int(*)[5], 指向a[i],而&a+1跳过45列共20个元素。

// *aa[0], 类型为int**a为指向数组a[0]首元素a[0][0]的指针。

//*(a+1)a[1],为指向数组a[1]首元素a[1][0]的指针。

//*(*(a+1)+2),为数组a[1]的第二个元素a[1][2];

4.数组的应用 略

0 0
原创粉丝点击