数组与其地址之间的关系是什么?
What is the relationship between an array and its address?
以下代码:
#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
添加到指针地址,最终会得到一个您看到的数字。
相关文章:
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- #include < conio.h> 和 getch() 方法之间的关系是什么?
- 超市管理系统的类别之间应该是什么关系?
- 回调和函数指针是什么关系
- 数组与其地址之间的关系是什么?
- C标准和C++标准之间的关系是什么?
- C++HOLDS_A关系是什么?
- 操作之间的关系中的对象类型是什么?
- 为什么有人告诉我数组是指针?C++中数组和指针之间的关系是什么
- STL和stdlib之间的关系是什么
- 多个头文件和类之间的关系是什么
- .ycm_extra_conf.py和Exuberant tags之间的关系是什么?
- 内联关键字的两种不同效果之间的关系是什么?
- char和CString的区别和关系是什么?
- 双指针和二维数组之间的关系是什么?
- iostream和命名空间std之间的关系是什么?
- 他们的论点之间的关系是什么?
- 堆栈和子类之间的正确UML关系是什么
- C和C++之间的关系是什么(更技术的方法)
- 有符号整数类型的最小值和最大值之间关系的C++标准保证是什么