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+ +中,函数名是作为指向函数的指针值来处理)。函数指针的最大用途是它可以使得一个函数作为其他函数的参数进行传递,扩展了函数的功能。