下面的代码澄清了我的问题:
0×05fee80
0×05fee84
打印:
- (void)bannerViewDidLoadAd:(ADBannerView *)banner
{
if (!_bannerIsVisible)
{
// If banner isn't part of view hierarchy, add it
if (_adBanner.superview == nil)
{
[self.view addSubview:_adBanner];
}
[UIView beginAnimations:@"animateAdBannerOn" context:NULL];
// Assumes the banner view is just off the bottom of the screen.
banner.frame = CGRectOffset(banner.frame, 0, -banner.frame.size.height);
[UIView commitAnimations];
_bannerIsVisible = YES;
}
}
在我的机器中,整数是4个字节。所以每个int都保留4个内存地址。但是当cout打印时,它会打印整数保留的第一个地址。这是我的观察。我是对还是错?如果我错了,请给出一点解释。我面临很多困惑,尤其是当数组出现在我的C ++生活中时。
答案 0 :(得分:2)
你是对的。地址指向值占用的空间的开头。
答案 1 :(得分:1)
根据ISO C ++ 11,1.8 The C++ object model
部分(我的粗体):
6 /除非对象是零字段或零大小的基类子对象,否则该对象的地址是它占据的 第一个 字节的地址
所以你纠正了,它会给你第一个字节的地址。如果您担心指针与对象及其地址之间可能存在脱节, 5.3.1 Unary operators
会显示这两个术语之间的连接。
就可能与数组混淆而言,最好显示一个例子。让我们说你有:
int arr[3];
在四字节整数实现中,这可以存储为:
0x0000: | byte 0.0 | byte 0.1 | byte 0.2 | byte 0.3 |
0x0004: | byte 1.0 | byte 1.1 | byte 1.2 | byte 1.3 |
0x0008: | byte 2.0 | byte 2.1 | byte 2.2 | byte 2.3 |
0x000c:
此处,&arr
和&arr[0]
都会为您提供0x0000
,因为它是存储整个数组和该数组的第一个元素的第一个字节。< / p>
但是,&arr[2]
实际上会给你0x0008
,因为这里讨论的对象是数组的第三个元素。
答案 2 :(得分:0)
没错。无论对象的sze如何,它的地址值都是它的第一个字节的地址。如果你有一个int数组,你可以通过使用&amp; array [1],&amp; array [2]等获得后续元素的地址。这将比你机器中的前一个值大4个字节。