C++的前世是 C,而且 C 所留下的神秘以及精简在 C++中是青出于蓝而胜于蓝!C 所带给人的困惑以及灵活太多,即使一个有几年经
验的高段 C 程序员仍然有可能在 C 语言的小水沟里翻船。不过其实 C 语言真的不难,下面我想指出 C 语言中最神秘而又诡谲多变的四
个地方,它们也继续在 C++语言中变幻莫测。W
指针,数组,类型的识别,参数可变的函数。
一.指针。
它的本质是地址的类型。在许多语言中根本就没有这个概念。但是它却正是 C 灵活,高效,在面向过程的时代所向披靡的原因所在。因
为 C 的内存模型基本上对应了现在 von Neumann(冯·诺伊曼)计算机的机器模型,很好的达到了对机器的映射。不过有些人似乎永
远也不能理解指针【注 1】。W
注 1:Joel Spolsky 就是这样认为的,他认为对指针的理解是一种 aptitude,不是通过训练就可以达到的W
指针可以指向值、数组、函数,当然它也可以作为值使用。W
看下面的几个例子:W
int* p;//p 是一个指针,指向一个整数W
int** p;//p 是一个指针,它指向第二个指针,然后指向一个整数W
int (*pa)[3];//pa 是一个指针,指向一个拥有 3 个整数的数组W
int (*pf)();//pf 是一个指向函数的指针,这个函数返回一个整数W
后面第四节我会详细讲解标识符(identi!er)类型的识别。W
1.指针本身的类型是什么?W
先看下面的例子:int a;//a 的类型是什么?W
对,把 a 去掉就可以了。因此上面的 4 个声明语句中的指针本身的类型为:W
int*$
int**$
int (*)[3]$
int (*)()$
它们都是复合类型,也就是类型与类型结合而成的类型。意义分别如下:W
point to int(指向一个整数的指针)W
pointer to pointer to int(指向一个指向整数的指针的指针)W
pointer to array of 3 ints(指向一个拥有三个整数的数组的指针)W
pointer to function of parameter is void and return value is int (指向一个函数的指针,这个函数参数为空,返回值为整数)W
2.指针所指物的类型是什么?W
很简单,指针本身的类型去掉W“*”号就可以了,分别如下:W
int$
int*$
int ()[3]$
int ()()$
3 和 4 有点怪,不是吗?请擦亮你的眼睛,在那个用来把“*”号包住的“()”是多余的,所以:W
int ()[3]就是 int [3](一个拥有三个整数的数组)W
int ()()就是 int ()(一个函数,参数为空,返回值为整数)【注 2】W
注 2:一个小小的提醒,第二个“()”是一个运算符,名字叫函数调用运算符(function call operator)。W
3.指针的算术运算。W
请再次记住:指针不是一个简单的类型,它是一个和指针所指物的类型复合的类型。因此,它的算术运算与之(指针所指物的类型)密
切相关。
int a[8];$