是第二个。
事实上:由于 const int * p 和 int *p 指向的内容的限定符不同(就认为是指向的类型不同),因此它们是不同类型的指针。
而 int * p 和 int * const p 指向的类型完全相同,只是后者多了一个 const 修饰符,因此一般认为它们是有不同的 cv-限定符(cv-qualifier)的相同类型的指针。术语 cv-限定符 是指 const 和 volatile。
const 关键字只能修饰一个标识符的 cv-限定,不能修改它的类型。
不知道这么理解是不是好一点:对于指针的声明 A * B identifier 中,A 是用来声明指针指向的类型的,它决定了指针的类型。B 是用来声明指针的 cv-限定的,与指针指向的类型无关。
一个类型 typedef 好之后,就不能用 const 来修饰它指向的类型了,只能修饰这个类型本身的属性。
就好像为了声明常成员函数,得写 int f() const, 它和 const int f() 完全不是一码事。
容易对 typedef 产生这类混淆的主要原因是因为它有的时候有点像宏,但是其实它并不是简单的替代。因此用 typedef 一般会避免很多混乱。
[
本帖最后由 pangding 于 2012-7-28 17:19 编辑 ]