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

What is the relationship between an array and its address?

本文关键字:关系 是什么 之间 地址 数组      更新时间:2023-10-16

以下代码:

#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不同.它们不应该是一样的吗?

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

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

所以当你在lista上加1时,它指向"下一个"int。但是&lista + 1指向 5 int 之后的位置(这可能无效)。

回答问题:

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

在此代码中,您获取数组lista的地址,并将1添加到获得的答案中。给定数组的大小是sizeof(int) * 5,这意味着当您将指向它的指针增加 1 时,您将sizeof(int) * 5添加到指针地址,最终会得到一个您看到的数字。