4.1 数组
考点1 数组的概念
数组是一种用一个名字来标识一组有序且类型相同的数据组成的派生数据类型,它占有一段连续的内存空间,数组的特征是(1)数组名;(2)数组各元素的类型;(3)维数(即标识数组元素所需的下标个数);(4)数组大小(即可容纳数组元素的个数)。
小提示:
使用数组之前必须用声明语句指明数组的上述4个特征。
考点2 一维数组
1. 一维数组的定义
一维数组也称向量,它是由具有一个下标的数组元素组成的数组,它的定义形式为:
类型 数组名[大小];
其中,方括号为下标运算符,具有最高优先级和从右向左结合性。
2. 一维数组的初始化
与其他的基本数据类型一样,数组也可以在定义的同时对数组各元素初始化,初始化表达式按元素顺序依次写在一对花括号内。花括号中的数组元素之间以逗号分
隔。初始化时可以不指定数组的大小,编译器会根据初始化列表来确定数组的大小。但只给出部分元素初始化时,就要指定数组大小。
小提示:
只将部分元素初始化后,其他元素的初始化值隐含地为0。
3. 访问数组元素
访问数组元素的语法格式为:
<数组名>「<表达式>〕
其中,<表达式>是非负的整型表达式,也就是数组的下标,数组下标是用来指定所要访问的数组中的元素位置。注意:数组下标是从0开始的。
考点3 二维数组
二维数组也称二级向量,我们可以把二维数组看做一个其元素为一维数组的一维数组。
定义二维数组的一般格式为:
<数据类型><数组名>[m][n];
二维数组中的每个元素要用两个下标来表示,前一个为行下标,后一个为列下标。因此,规定[m]表示二维数组的行下标的大小,[n]表示二维数组的列下标的大小。
二维数组元素的表示方法为:
<数组名>[<下标1>][<下标2>];
其中,这两个下标的取值范围都是从0开始,而不是从1开始的。
与一维数组一样,二维数组也可在定义的同时进行初始化,方法也是类似的。举例如下:
int a[2][2]={{1,1},{3,2}};
但需要注意的是,如果对全部元素赋初值,一维数组能根据赋的初值的个数自动计数以确定数组的大小,所以定义的时候可不指定第一维的大小,但第二维的大小是不可以省略的。
小提示:
在C++中,二维数组在计算机中的存储顺序是安排好行顺序存储的,就是先存储第1行,然后再存储第2行,依次类推。
考点4 多维数组
由一维和二维数组的定义类推可以推得多维数组就是多级向量,它的元素要用数组名加n个下标来标识。多维数组的大小为各维大小的乘积。若将多维数组作为函
数的形参时,可以不指定第一维的大小,但其他维的大小一定要指定。多维数组只可以作为引用参数传递给函数,且函数的返回值不可以是数组类型。
考点5 字符数组
1. 字符数组的概念
字符数组就是一个字符类型的数组,其中每一个元素存放一个字符。字符数组也称字符串。C++规定,字符数组的最后一个元素一定是’/0’。例如,字符数
组存储字符串:" Hello!world. "的语句形式为:char str[]=" Hello!world";但系统会自动在其末尾加一个空白字
符’/0’。也就是说字符数组存储一个字符串比实际使用的字符串要多一个字节。
2. 常用字符串函数
C++提供了一系列字符串处理函数,这些函数都包含在cstring头文件中。常用的C++字符串处理函数如下。
(1)strcat字符串1,字符串2)。此函数是字符串连接函数,它的功能是把两个字符串连接起来。具体方法是把字符串2连接到字符串1的末端,并将结果存放到字符串1中。注意:存放结果字符串的数组的空间要确保足够大。
小提示:
两个字符串连接后,前一个数组最后的字符’/0’就消失了。
(2) strcpy(字符串1,字符串2)。此函数是字符拷贝函数,它的功能是把一个字符串中的字符拷贝到另一个字符串变量中。具体方法是把字符串2中的字符拷贝到字符串1中。注意:要确保存放结果的字符串1的空间足够大。
(3) strcmp(字符串1,字符串2)。此函数是字符串比较函数,它是用来比较字符串的。比较方法是:若两个字符串相等(匹配),返回
0(“假”);若字符串1在字典顺序上比字符串2大,则返回一个正数;若字符l在字典顺序上比字符串2小,则返回一个负数。
(4) strlen(字符串)。此函数是字符串长度函数,它的功能是求字符串的长度。函数的值为字符串中不计’/0’的字符的个数。
(5) strstr(字符串1,字符串2)。此函数是字符串查找函数.它的功能是在一个字符串中查找子串。查找方法是在字符串1中从左边开始查找字符串2,若查找成功,返回字符串2在字符串1中第一次出现的位置则返回NULL,若字符串2为" ",则返回字符串1。
4.2 指针
考点6 指针与地址
指针是一种非常重要的派生数据类型,用它可以构造复杂的数据结构。具有指针类型的变量称为指针变量,一个指针变量所存储的信息是一个对象在内存中的地址。通过指针变量可以间接地访问对象。指针变量声明的一般格式为:
<数据类型>*<变量名>;
其中,<数据类型>是指针所指对象的类型,在C++中指针可指向任何C++类型;<变量名>是指针变量名;定义指针变量时必须把*号放在变量名前。
*
和&是指针使用的两种特殊的运算符,它们都是单目运算符,都具有较高的优先级和从右向左的结合性。&是取地址运算符。一个指针可以用一个具有相同
类型的对象的地址值初始化,用&运算符可以获香一个对象在内存中的地址。*是间接引用运算符,与取地址运算符互为逆运算,它是获取对象的值,并且它要求其
操作对象是一个指针。
在使用任何指针变量之前必须首先给它赋一个所指合法具体对象的内存地址值。
小提示:
一个指针还可以用具有同样类型的另一个指针初始化;一个指针变量也可以赋空值。
考点7 指针运算
指针是一种数据类型,应具有无符号整数的值。由于地址本身的特征,也给指针运算带来一些限制。一般来说,指针所允许的运算有以下4种。
(1)赋值运算。可以将一个指针所指向的变量的地址值赋给它,也可以将一个数组的地址值或者一个函数在内存的入口地址值赋给所对应的指针,还可以将一个已被赋值的指针赋给另外一个相同类型的指针。
(2)指针与整数相加、减运算。指针与整数相加、减,表示指针在内存空间同下、上移动,移动以其类型长度为单位。这种运算也包括加1或减1运算,即指针向下或向上移动一个所指向的数据类型空间。
(3)在一定的条件下,两个指针可以相减。例如,指向同一个数组的不同元素的两个指针可以相减,其差值是这两个指针之间相隔元素的个数。
(4)一定的条件下,两个指针可以相比较。例如,指向同一个数组的元素的两个指针可以相比较,当这两个指针相等时,说明这两个指针是指向同一个数组元素的。
考点8 指针与数组
C++中,数组与指针的关系极为密切,编译器在处理数组时,常常按指针形式处理,使数组元素具有下标和指针两种形式。这两种形式是通过数组的地址关系联系在一起的。在C++中,数组名是指针,对一维数组来说,它是一级指针;对多维数组来说,它是多级指针。例如:
int a[4];//a是一维数组名,它有4个int型变量
用指针方法表示时*(a+i)与a[i](其中i=0,1,2,3)是相同的。
通常把二维数组的数组名称为该数组的行指针,把其下一级指针称为列指针。例如:
int b[2][4];//b是二维数组名,它有8个int型变量
用指针方法表示时*(*(b+i)+j)与b[i][j](其中i =0,l;j =0,1,2,3)是相同的。若将二维数组的行、列的一维数组都用指针表示,可以得到以下形式:
*(*(b+i)+j)
C++中,字符串常量可以看做一个没有名字的字符数组,C++编译器会自动为它分配一个空间存放这个常量,字符串常量的值本身就是指向这个没有名字的字符数组的第1个字符的指针,它的类型是字符指针。
4.3 引用
考点9 引用的概念
引用通常被认为是一种变量的别名。当建立引用时,程序用另一个变量或对象的名字初始化它。对引用的改动,实际上是对目标的改动。引用的用途是做函数的参数或函数的返回值。引用的格式为:
<类型>&<引用名>(<变量名>);或<类型>&<引用名>=<变量名>;
小提示:
引用操作符与地址操作符为同一个字符&,但含义不同。
一般地,使用引用时应遵循的规定如下。
(1)引用在定义时必须初始化(指针可以在任何时候进行初始化)。
(2)对引用的操作就是对被引用的变量的操作。
(3)可以把某个引用的地址值赋给一个指针,而指针则指向被引用的变量。
(4)可以把某个引用赋给一个变量,该变量的值便是被引用的变量值。
(5)引用一旦被初始化后不得再作为其他变量的别名(指针可以在任何时候改变指向其他变量)。
(6)不可以有NULL引用。
4.4 动态存储分配
考点10 动态存储分配的实现
1.使用new获得动态内存空间
C++
的运算符new与delete能提供动态分配内存的功能。new的功能是给程序实体动态地分配空间。new是一个单目运算符,动态分配存储区的基本办法是
声明一个指针,用它指向用new分配的可容纳给定类型数据的空间。使用new对某种类型变量进行动态分配的语法格式为:
<指针>=new<类型>;、
例句:int*p=new int;
new可以在为简单变量动态分配内存空间的同时,进行初始化。语法格式为:
<指针>=new<类型>(<初值表达式>);
例句:int *p=new int(256);//给指针P分配一块int区,同时,将该存储区初始化
为256。
new可以用来对数组进行动态分配。语法格式为:
<指针>=new<类型>[<元素个数>];
例句:int*P=new int[4];//给地址P分配4个int类型空间
小提示:
new不能对动态分配的数组存储区进行初始化。
2.使用delete释放动态内存空间
delete也是一个单目运算符,delete的功能是将用new运算符动态分配的空间收回。
注意:C++的程序new分配的动态存储空间必须由delete释放。也就是说,若程序中需要分配动态内存空间时,new和delete总是成对出现的。使用delete对动态分配的单个变量进行释放的语法格式为:
delete<指针>;
使用delete对动态分配的数组进行释放的语法格式为:
delete[]<指针>;
例句:delete[]p; //释放P指向的数组存储C,无须标空间大小。
来源:http://www.51edu.com/it/2008/1214/article_8659.html