索引在数组中到底是如何工作的?
首先,让我们了解一下数组,它是存储在连续内存位置的项目的集合。其基本思想是将同一类型的多个项目存储在一起,可以通过 索引/键(一个数字)进行访问。
申报大小的连续内存被分配在堆/栈上,然后在运行时以数学方式计算元素的地址:-
元素地址=(基础地址)+(元素索引*单个元素的大小)。
其中。
- 基准地址。它是索引为0的元素的地址,或者说是内存中数组第一个元素的位置。编译器知道这个地址是数组的内存位置。
- 元素索引。它是分配给元素的序列号(索引/键),其中数组的第一个元素被分配为0。它也可以定义为数组中该特定元素之前的元素数。
- 单个元素的大小。阵列中的元素需要是相同的数据类型或对象。单个元素的大小是指内存中存储该种单个元素所需的字节数。
比如说。
Int类型需要4字节(32位)
char类型需要1字节(8位)
long类型需要8字节(64位)等。
上述实现的例子。
int arr[6] = {3, 4, 7, 9, 7, 1}
arr[0]的地址(基址)= 0 x 61fe00
arr[3]的地址(元素地址)=(基址)+(元素索引*单个元素的大小)
0 x 61fe00 + ( 3 * 4) = 0 x 61fe0c
这里,单个元素的大小为4字节,因为它是int型数组。long long arr[6]={100, 12, 123, 899,124, 849}
arr[0]的地址(基址)=0x61fdf0
arr[3]的地址(元素地址)=(基址)+(元素索引*单个元素的大小)
0x61fdf0 + ( 3 * 8) = 0x61fe08
这里,单个元素的大小是8字节,因为它是长-型阵列。注意:这里的地址是十六进制的。
让我们通过一个打印数组元素地址的程序来看看它的实现。
C++
// Program to show how indexing works
#include <iostream>
using namespace std;
int main() {
int arr[6] = {3,4,7,9,7,1};
cout << "Base address:- " << (&arr) << endl;
cout << "Element address at index 3:- " << (&arr[3]) << endl;
return 0;
}
输出
Base address:- 0x7ffc64918c30
Element address at index 3:- 0x7ffc64918c3c
