2012年计算机二级C++数组、指针与引用考点归纳

来源:计算机等级考试    发布时间:2012-08-29    计算机等级考试视频    评论

  4.2 指针

  指针(即指针变量)是C+ +语言最大的功能之一。一个指针是一个特定类型数据的存储地址,比如一个变量的地址。

  与其他类型变量一样,指针变量也必须要声明。指针变量声明的一般形式为:

  <数据类型>*<变量名>;

  其中,<数据类型>是指针所指对象的类型,在C+ +中可以指向任何C+ +类型。<变量名>是指针变量名。

  指针使用两种特殊的运算符——*和&。

  一元(单目)运算符&用于返回其操作对象的内存地址,其操作对象通常为一个变量名。例如:

  ptr=&total;

  把变量total的内存地址存到指针变量ptr中。该地址是total变量在计算机内存中的存储地址。

  第二个与指针相关的运算符是*,它与&运算符作用相反。作为一元运算符的*用于返回其操作数所指对象的值,因此,该运算符要求其操作对象为一个指针。

  1指针和地址

  (1)指针说明

  从指针的定义可知,指针是用所指对象类型来表征的。在使用任何指针变量之前必须先给它赋一个所指合法具体对象的地址值。

  如何使一个指针指向一个具体对象:

  ①使用new运算符(或malloc和alloc等函数)给指针分配一个具体空间。

  ②将另一个同类型的指针赋给它以获得值。

  ③通过&运算符指向某个对象。

  (2)指针运算

  尽管指针中存放的是变量的地址,但在C+ +中指针只能进行如下运算。

  ①指针和整型量可以进行加减

  ②若p1,p2为指针,当p1和p2指向同一类型时,可以进行赋值。

  ③两个指向同一类型的指针,可进行= =,>,<等关系运算,其实就是地址的比较。

  ④两个指向同一数组成员的指针可进行相减,结果为两个指针之间相差元素的个数。

  注意:两指针不能相加。

  2指针和数组

  在C+ +中,指针和数组的关系极为密切。实际上,数组的参数传递、数组元素的存取,都可通过指针操作来完成。指针和数组常常可以互换。

  在C+ +中,数组的名字就是指向该数组第一个元素(下标为0)的指针,即该数组第一个元素的地址,也即数组的首地址。

  一般情况下,一个数组元素的下标访问a[i]等价于相应的指针访问*(a+i)。但特别注意:数组名和指针(变量)是有区别的,前者是常量,即数组名是一个常量指针,而后者是指针变量。因此,尽管我们可写pa=a;但不能写:a=pa;或pa=&a;因为我们不能改变常量的值,也不能取常量的地址。

  数组名可作为参数进行传递。当将数组名传给函数时,实际上所传递的是数组的开始地址。(即数组第一个元素的地址)

  为什么要使用指针?简单地说指针运算比数组运算的速度快。

  此外,使用指针的另外一个原因是在大量数据传递时,使用传递指针要远比传递数据本身效率高的多,如在函数参数传递及函数返回值时。当然,使用指针会给程序带来安全隐患(如指针悬挂问题),同时还使得程序的可读性降低(显然,用数组实现的程序要比用指针实现的程序的可读性要好)。

  对于字符串常量,可以把它看成是一个无名字符数组,C+ +编译程序会自动为它分配一个空间来存放这个常量,字符串常量的值本身就是指向这个无名字符数组的第一个字符的指针,其类型是字符指针。

  3指针数组和函数指针

  (1)指针数组

  指针数组就是由指针组成的数组,即数组中的每一个元素都是指向同一类型对象的指针。

  指针数组可以是全局的、静态的和局部的。字符指针数组和二维字符数组在许多方面是一样的,如初始化形式、成员访问方式,因此我们有必要了解它们的区别和各自的使用场合。

  尽管二维字符数组与字符指针数组在存储形式上不同,但它们在初始化形式以及访问元素方式上却是相同的。

  采用指针数组的理由是:它可以节省存贮空间,因而通常用来存放不同长度的字符串。例如,如果要保存从标准输入或文件中读入的行,字符指针数组是一个好的选择。因为读入的行可能长短差异很大。

  (2)命令行参数

  在C+ +中可以实现带有命令行参数的程序,它是通过main带有参数来实现的。

  在C+ +中,主函数main还可以带有参数,形式如下:

  int main(int argc,char * argv[])

  或int main(int argc,char * * argv[])

  其中:

  argc为包含命令本身在内的参数个数。

  argc为指针数组,数组元素为指向各参数(包含命令本身在内)的指针。

  (3)函数指针

  在C+ +中,允许指针指向一个函数,即指向函数的指针。函数指针的说明形式为:

  类型(*标识符)();

  例如:int (* fp)();定义了一个指向返回值为整型值的函数的指针fp。

  注意:int(*fp)();与int*fp();的不同在于,前者是函数指针,后者为返回指向int指针的函数。

  与其他类型的指针变量一样,在使用函数指针前必须使它指向一个具体的函数。若要函数指针指向一个具体函数,可通过赋值语句或参数传递。

    函数指针=函数名;

  该赋值语句将使一个函数指针指向一个具体函数(在C+ +中,函数名是作为指向函数的指针值来处理)。函数指针的最大用途是它可以使得一个函数作为其他函数的参数进行传递,扩展了函数的功能。

  4.3 引用

  1引用的概念

  引用是个别名,建立时须用另一个数据对象(如一个变量)的名字进行初始化,以指定该引用所代表的数据对象。此后,对引用的任何实操作实际上就是对所代表的数据对象的操作。一个引用变量要占用相当于一个指针所需要的空间,但系统不会为它所代表的数据对象再次分配空间。

  在类型名后跟引用运算符“&”,以及引用名来创建一个引用。引用名就是一个变量名。

  注意:引用运算符与地址操作符使用相同的符号(即运算符重载),但它们含义不一样。引用运算符只在声明变量的时候使用,它放在类型名后面。

  使用引用时应遵循一定的规则:

  (1)引用被创建时,它必须立即被初始化(指针则可以在任何时候被初始化)。

  (2)一旦一个引用被初始化为一个对象的引用,它就不能再被改变为对另一个对象的引用。(指针则可以在任何时候改变为指向另一个对象。)

  (3)不可能有NULL引用。必须确保引用是具体合法的对象的引用(即引用应和一块合法的存储空间关联)。

  2用引用传递函数参数

  引用的一个重要用途就是作为函数的参数。在C+ +中,函数参数传递采用的是传值,如果要有占用空间大的对象(例如一个大的结构对象或类对象)需要作为函数参数传递的时候,在C语言中的做法往往是使用指针,因为这样可以避免将整个实参对象数据全部拷贝给形式参数,可以提高程序的执行效率。在C+ +中,既可以使用指针,但由于C+ +引入了引用概念,亦可以用引用来做同样的事情。引用作为参数的最大好处是:引用参数既可以像指针那样工作,其使用方式又和一般变量相同。也就是说,引用比指针具有更好的可读性。

  4.4 动态存储分配

  动态存储分配功能在C+ +中是通过new和delete运算符来实现的。

  1使用new获得动态内存空间

  运算符new用于申请动态存储空间,它的操作数为某种数据类型且可以带有初值表达式或元素个数。new返回一个指向其操作类型变量的指针。使用new对某种类型变量进行动态分配的语法格式为:

  <指针>=new<类型>;

  其中,<类型>表示要分配的变量类型(如char、int、double);<指针>表示指向<类型>类型变量的指针(如char*、int*、double*等)。

  2使用delete释放动态内存空间

  当动态分配的内存空间在程序中使用完毕之后,必须显式地将它们释放。这样做的目的是把闲置不用的堆内存归还给系统,使其可以被系统重新分配。在C+ +程序中由new分配的动态内存空间必须通过delete运算符释放。使用delete对动态分配的单个变量进行释放的语法格式为:

  delete<指针>;

  其中,<指针>表示指向单个变量的指针。

  使用delete对动态分配的数组进行释放的语法格式为:

  delete[]<指针>;

  其中,<指针>表示指向数组首元素的指针。delete之后的方括号指明将要释放的内存空间中存储着数组元素。程序中需要分配动态内存空间,则new和delete总是成对出现的。

上一页12下一页

视频学习

我考网版权与免责声明

① 凡本网注明稿件来源为"原创"的所有文字、图片和音视频稿件,版权均属本网所有。任何媒体、网站或个人转载、链接转贴或以其他方式复制发表时必须注明"稿件来源:我考网",违者本网将依法追究责任;

② 本网部分稿件来源于网络,任何单位或个人认为我考网发布的内容可能涉嫌侵犯其合法权益,应该及时向我考网书面反馈,并提供身份证明、权属证明及详细侵权情况证明,我考网在收到上述法律文件后,将会尽快移除被控侵权内容。

最近更新

社区交流

考试问答