我们可以说cout只打印变量的第一个地址

时间:2015-08-19 02:00:21

标签: c++ memory-address

下面的代码澄清了我的问题:

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 ++生活中时。

3 个答案:

答案 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个字节。