数组与其地址之间是什么关系?

时间:2019-02-22 19:19:31

标签: c++ arrays

以下代码:

#include<iostream>

int main (void) {

    int lista[5] = {0,1,2,3,4};
    std::cout << lista << std::endl;
    std::cout << &lista << std::endl;
    std::cout << lista+1 << std::endl;
    std::cout << &lista+1 << std::endl;
    std::cout << lista+2 << std::endl;
    std::cout << &lista+2 << std::endl;
    std::cout << lista+3 << std::endl;
    std::cout << &lista+3 << std::endl;

    return (0);
}

输出:

0x22ff20
0x22ff20
0x22ff24
0x22ff34
0x22ff28
0x22ff48
0x22ff2c
0x22ff5c

我知道数组是表示指针的另一种形式,但是我们不能在声明后将其地址更改为指向其他任何地方。我还了解到数组的值是其在内存中的第一个位置。因此,在此示例中,0x22ff20是数组起始位置的位置,并且第一个变量存储在该位置。

我不明白的是:为什么其他变量没有按数组地址顺序存储?我的意思是,为什么lista+1&lista+1不同。他们应该不一样吗?

2 个答案:

答案 0 :(得分:11)

在指针算法中,类型很重要。

的确,lista&lista value 相同,它们的类型不同:lista(在cout调用中使用的表达式)的类型为int*,而&lista的类型为int (*)[5]

因此,当您将1加到lista时,它指向“下一个” int。但是&lista + 1指向5 int之后的位置(可能无效)。

答案 1 :(得分:3)

回答所提出的问题:

std::cout << &lista+1 << std::endl;

在此代码中,您使用数组lista的地址,并将1添加到获得的答案中。给定数组的sizeof为sizeof(int) * 5,这意味着当您将指向该数组的指针加1时,会将sizeof(int) * 5添加到指针地址,最后得到一个看到的数字。