&下面看起来是一个新功能(c ++ 11?),而不仅仅是提取变量的地址,因为把它(&)放在不同的位置使得值t不同。这是什么意思?
// test_ampersand.cpp
int _tmain(int argc, _TCHAR* argv [])
{
int a[10] = { 2, };
int* p = a;
int t = (int) *((short *&) p);
// int t = (int) *((short *) &p);
return 0;
}
答案 0 :(得分:2)
short *&
是对short
指针的引用。这是简单的C ++。反正它并不是真的需要它,因为结果从未被用作左值 - 指针只是立即被取消引用为右值。
答案 1 :(得分:1)
这不是一个新功能,它只是一个参考 - 它正在向p
引用short*
。换句话说,你告诉编译器:“认为包含p
的字节属于short*
类型。” (这也意味着你可以像这样分配给他们,但这不适用于此)。
从int*
到short*
和一个到short* &
的广告投放之间的差异取决于处理器架构。如果int*
和short*
在内存中具有相同的表示,则没有区别。它只会改变指针给你的解除引用。
但是,如果您在short
小于int
的(可能是假设的)平台上,同时int
是最小的正常可寻址单位,那么实际上会完全不同。原因是在这种情况下,short*
必须存储int
的地址以及和short
内的int
的偏移量{1}}。所以sizeof(int*) < sizeof(short*)
就是这种情况。请注意,实际架构中sizeof(int*) < sizeof(char*)
正是出于这个原因,所以它不是所以牵强附会。
在这种架构上,演员int* -> short*
意味着“计算short*
的表示,使其指向与原始int*
相同的位置。”演员int* -> short*&
意味着“将int*
的表示解释为short*
。”如果sizeof(int*) < sizeof(short*)
在这样的平台上,那甚至可能是无效的代码。