3.4.7 用指针和引用作为修饰符
迄今为止,我们已经看到了基本的数据类型char、int、float和double,看到了修饰符signed、unsigned、short和long,它们可以和基本的数据类型结合使用。现在我们增加了指针和引用(它们与基本数据类型和修饰符是独立的),所以可能产生三倍的结合:
当传递对象进出函数时,指针和引用也能工作;我们将会在后面的一章了解到这些内容。
这里有和指针一起工作的另一种类型:void。如果声明指针是void,它意味着任何类型的地址都可以间接引用那个指针(而如果声明int,则只能对int型变量的地址间接引用那个指针)。例如:
一旦我们间接引用一个void*,就会丢失关于类型的信息。这意味着在使用前,必须转换为正确的类型:
转换(int)vp告诉编译器把void当做int处理,因此可以成功地对它间接引用。读者可能注意到,这个语法很难看,的确如此,但是更糟的是,void在语言类型系统中引入了一个漏洞。也就是说,它允许甚至是提倡把一种类型看做另一种类型。在上面的例子中,通过把vp转换为int,把一个整型看做是一个整型,但是,并没有说不能把它转换为一个char或double*,这将改变已经分配给int的存储空间的大小,可能会引起程序崩溃。一般来说,应当避免使用void指针,只有在一些少见的特殊情况下才用,到本书的后面才需要考虑这些。
我们不能使用void引用,其原因将在第11章说明。