Карта памяти массива
Если бы у меня был массив размером 10 с базовым адресом, скажем 0x5600bc
, Какова будет область памяти каждого элемента массива и ptr
?
Пример: что такое Arr[0]
адрес, это будет 0x5600bc
? И это сделало бы Arr[1]
быть 0x5600c0
?
3 ответа
Дано
typename foo[10] = { 0 };
затем foo[0]
будет по какому-то адресу, (uintptr_t)&foo[0]
,
foo[1]
я сидела (uintptr_t)&foo[0] + sizeof typename
, а также foo[n]
я сидела (uintptr_t)&foo[0] + n * sizeof typename
,
Вот так (предполагая 4-байтовый тип здесь)
0x00000000 arr[0] <- arr is a pointer to this location
0x00000004 arr[1]
0x00000008 arr[2]
...
Если у вас есть массив 32-битных целых чисел, то это 4 байта каждый, и массив начинается с 0x5600bc
тогда да, arr[1]
Будет в 0x5600c0
,
Вы можете напечатать адреса каждого элемента в вашем массиве следующим образом:
#include <stdlib.h>
#include <stdio.h>
int main(void) {
#define ARR_SIZE 10
int arr[ARR_SIZE] = {0};
for (size_t n = 0; n < ARR_SIZE; ++n) {
printf("arr[%zu] = %p\n", n, (void*)&arr[n]);
}
return EXIT_SUCCESS;
}
Расположение Arr[n]
будет 0x5600bc + n*sizeof(Arr[0])
, Так что, если размер элементов массива 4
, Arr[1]
действительно будет в 0x5600c0
,
Имя массива (идентификатор) на самом деле является указателем на его первый элемент, поэтому ответ на Arr[0]
является 0x5600bc
, В зависимости от type
массива и, более конкретно, его element size
(в байтах) будет определять приращение адреса каждого следующего элемента.
В общем, используется режим косвенной адресации, где у вас есть: base address + offset
, где base = array name
, offset = (element size)*(index of element)
Большие объяснения для массивов и указателей и массивов.
Графическое представление: