我不知道为什么这个简单的代码不起作用。有人可以解释一下吗?
int main()
{
const char* c = "ret";
typedef unsigned char GOK_UINT8;
typedef GOK_UINT8* pGOK_UINT8;
const pGOK_UINT8 y = reinterpret_cast<const GOK_UINT8*>(c);
return 0;
}
有人能告诉我为什么reinterpret_cast不起作用吗?
谢谢, 戈库尔。
答案 0 :(得分:12)
有人能告诉我为什么reinterpret_cast不起作用吗?
AFAICS,reinterpret_cast
应该可以正常工作,但之后的分配应该会导致错误。
这是因为const GOK_UINT8*
是指向const
const
个对象的非GOK_UINT8
指针,而const pGOK_UINT8
是指向const
的指针非const
个对象。
前者保护所引用的对象,后者指向对象。如果允许分配,则可以更改const GOK_UINT8*
意图防止更改的对象。
请注意,typedef
ed指针表现得很奇怪。这是因为C语言中const
的奇怪声明语法(C也因此也在C ++中): A const
保护左边的东西,除非没有任何东西,然后它保护正确的事情。因此在T const
和T const*
中,T
类型的对象受到保护,而T* const
中指向类型对象的指针受到保护。 T
受到保护。如果你有
typedef T* TPtr;
然后TPtr const
再次生成指针const
。 const TPtr
也是如此。 typedef
ed指针指向const
或非const
对象,您无法更改它。你不能将const
填入TPtr
附近,并期望保护指针所指的对象。
(顺便说一句,这就是为什么STL课程必须同时定义iterator
和const_iterator
。)
答案 1 :(得分:2)
是的,sbi是正确的。
相应地修改了您的代码,
const char* c = "ret";
typedef unsigned char GOK_UINT8;
typedef const GOK_UINT8* pGOK_UINT8;
pGOK_UINT8 y = reinterpret_cast<const GOK_UINT8*>(c);
printf("%s", y);