[英]What does ampersand mean here?
&下面看起来是一个新功能(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;
}
short *&
是对short
的指针的引用。 这是简单的C ++。 反正它并不是真的需要它,因为结果永远不会被用作左值 - 指针只是立即被取消引用为右值。
这不是一个新的功能,它只是一个参考-和它的铸造p
到参考short*
。 换句话说,你告诉编译器:“认为包含p
的字节是short*
类型。” (这也意味着你可以像这样分配给他们,但这不适用于此)。
从int*
到short*
和one到short* &
之间的差异取决于处理器架构。 如果int*
和short*
在内存中具有相同的表示,则没有区别。 它只会改变指针给你的解除引用。
但是,如果你在一个(可能是假设的)平台上,其中short
小于int
,同时int
是最小的正常可寻址单元,它实际上会完全不同。 原因是在这种情况下, short*
必须存储一个地址( int
) 以及该int
内的short
偏移量。 因此, sizeof(int*) < sizeof(short*)
。 请注意,有一些实际的体系结构,其中sizeof(int*) < sizeof(char*)
正是出于这个原因,所以它并非如此牵强。
在这样的体系结构中,cast int* -> short*
意味着“计算short*
的表示,使其指向与原始int*
相同的位置”。 cast int* -> short*&
表示“将int*
的表示解释为short*
。” 如果在这样的平台上sizeof(int*) < sizeof(short*)
,那甚至可能是无效代码。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.