以下代码:
#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
不同。他们应该不一样吗?
答案 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
添加到指针地址,最后得到一个看到的数字。