user-0 提问: C语言和C++语言下(Type *)和（Type * &）有什么区别

回复:
user: user-1
content: char * pTemp1 = (char *&)szTemp;把数组名（地址值）强制转换为，指针引用 ，运行时出错。。。 感觉应该编译时出错才对。 这地方是不是编译器理解错了。

user: user-2
content: 理解和讨论之前请先学会如何观察！  仅供参考：//char (*(*x[3])())[5];//x是什么类型的变量? // //分析C语言声明，关键是搞清楚这个变量是个什么东西（函数、指针、数组）， //是函数那么剩下的就是他的参数和返回值， //是指针那剩下部分是说明他指向什么， //是数组剩下的部分就是说明数组的成员是什么类型。 //解析C语言声明规则： //从左侧第一个标识符开始，按照优先级进行结合。*表示是..的指针，const表示只读的，volatile表示可变的，[]表示是数组，()表示是函数。 // //x和[3]结合说明是一个大小为3的数组，该数组的每个元素为一类指针，该类指针指向一类函数，该类函数无参数，返回一类指针，该类指针指向一个大小为5的char型数组 #include <stdio.h> #include <typeinfo.h> char num[5]; char (*x00())[5] {     return # } int main() {     char (*(*x[3])())[5];//是个数组，大小为3     char (*(*x0  )())[5];//数组的元素，是个函数指针     char (*( x00 )())[5];//函数原型，参数为空，返回值为指针     char (*  x000   )[5];//返回值      x0 = x00;     x[0] = x0;     x[1] = x0;     x[2] = x0;     printf("typeid(x).name() is %s\n",typeid(x).name());     return 0; } //typeid(x).name() is char (* (__cdecl**)(void))[5]

user: user-3
content: 引用 5 楼 fefe82 的回复:C:  这个错误的。  C++: pTemp2 不解释了。 pTemp1 = (char *&)szTemp; C 形式的类型转换可以被解释为 const_cast, static_cast ( + const_cast), reinterpret_cast  ( + const_cast) 之一。哪个先成功(语法上)用哪个。  这里，由于 const_cast, static_cast 都不能成功（语法上）（static_cast 能处理啥就不列了），实际相当于： pTemp1 = reinterpret_cast<char *&>(szTemp); 对 reinterpret_cast ，当目标类型是左值引用时，被转换类型是不执行 array-to-pointer conversion 的。 引用5.2.10 Reinterpret cast  1 The result of the expression reinterpret_cast<T>(v) is the result of converting the expression v to type T. If T is an lvalue reference type or an rvalue reference to function type, the result is an lvalue; if T is an rvalue reference to object type, the result is an xvalue; otherwise, the result is a prvalue and the lvalue-torvalue (4.1), array-to-pointer (4.2), and function-to-pointer (4.3) standard conversions are performed on the expression v. Conversions that can be performed explicitly using reinterpret_cast are listed below. No other conversion can be performed explicitly using reinterpret_cast. 引用An lvalue expression of type T1 can be cast to the type “reference to T2” if an expression of type “pointer to T1” can be explicitly converted to the type “pointer to T2” using a reinterpret_cast. That is, a reference cast reinterpret_cast<T&>(x) has the same effect as the conversion *reinterpret_cast<T*>(&x) with the built-in & and * operators (and similarly for reinterpret_cast<T&&>(x)). The result refers to the same object as the source lvalue, but with a different type. The result is an lvalue for an lvalue reference type or an rvalue reference to function type and an xvalue for an rvalue reference to object type. No temporary is created, no copy is made, and constructors (12.1) or conversion functions (12.3) are not called.  pTemp1 = reinterpret_cast<char *&>(szTemp); 相当于 pTemp1 = *reinterpret_cast<char *>(&szTemp); 这实际相当于将szTemp 的内容（"abcd"，0x??????0064636261） 当作一个 char * 来解释，并把它（0x??????0064636261）赋值给了 pTemp1。  写错了： pTemp1 = reinterpret_cast<char *&>(szTemp); 相当于 pTemp1 = *reinterpret_cast<char **>(&szTemp);

user: user-3
content: C:  这个错误的。  C++: pTemp2 不解释了。 pTemp1 = (char *&)szTemp; C 形式的类型转换可以被解释为 const_cast, static_cast ( + const_cast), reinterpret_cast  ( + const_cast) 之一。哪个先成功(语法上)用哪个。  这里，由于 const_cast, static_cast 都不能成功（语法上）（static_cast 能处理啥就不列了），实际相当于： pTemp1 = reinterpret_cast<char *&>(szTemp); 对 reinterpret_cast ，当目标类型是左值引用时，被转换类型是不执行 array-to-pointer conversion 的。 引用5.2.10 Reinterpret cast  1 The result of the expression reinterpret_cast<T>(v) is the result of converting the expression v to type T. If T is an lvalue reference type or an rvalue reference to function type, the result is an lvalue; if T is an rvalue reference to object type, the result is an xvalue; otherwise, the result is a prvalue and the lvalue-torvalue (4.1), array-to-pointer (4.2), and function-to-pointer (4.3) standard conversions are performed on the expression v. Conversions that can be performed explicitly using reinterpret_cast are listed below. No other conversion can be performed explicitly using reinterpret_cast. 引用An lvalue expression of type T1 can be cast to the type “reference to T2” if an expression of type “pointer to T1” can be explicitly converted to the type “pointer to T2” using a reinterpret_cast. That is, a reference cast reinterpret_cast<T&>(x) has the same effect as the conversion *reinterpret_cast<T*>(&x) with the built-in & and * operators (and similarly for reinterpret_cast<T&&>(x)). The result refers to the same object as the source lvalue, but with a different type. The result is an lvalue for an lvalue reference type or an rvalue reference to function type and an xvalue for an rvalue reference to object type. No temporary is created, no copy is made, and constructors (12.1) or conversion functions (12.3) are not called.  pTemp1 = reinterpret_cast<char *&>(szTemp); 相当于 pTemp1 = *reinterpret_cast<char *>(&szTemp); 这实际相当于将szTemp 的内容（"abcd"，0x??????0064636261） 当作一个 char * 来解释，并把它（0x??????0064636261）赋值给了 pTemp1。

user: user-4
content: 你的这个char * pTemp1 = (char *&)szTemp;没报错么？我的vc6.0报错了。强制转换应该是第二种char * pTemp2 = (char *)szTemp; 而且强制转换的前提是类型不明的空指针，你的这个用强制转换时多此一举的。而且你的*&有点像Ｃ＋＋中的指向指针的引用，如： int i = 42; int *p; //p是一个int型指针 int  *&r=p; // r是一个对指针p的引用

user: user-3
content: 引用 8 楼 lm_whales 的回复:pTemp1 = *reinterpret_cast<char **>(&szTemp); 这道可以解释的通了 不过，这地方，还是该给个警告才对。  这是标准规定好的行为。  另外，所有的用 reinterpret_cast (或者 C-style cast) 的地方，都应该自己给自己一个警告。 这各东西永远都有危险，编译器恐怕不好区分出相对“安全”的情况。 基本都需要程序员自行保证程序正确的。

user: user-1
content: pTemp1 = *reinterpret_cast<char **>(&szTemp); 这道可以解释的通了 不过，这地方，还是该给个警告才对。

user: user-5
content: char * pTemp1 = (char *&)szTemp; 这个什么含义呢？&放在这里感觉应该是作为取地址，而不是引用。 楼主的输出语句是怎么写的？

user: user-6
content: Type * & 是 Type * 指针的引用类型，正如int 与 int&的区别