Карта памяти массива

Если бы у меня был массив размером 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)

Большие объяснения для массивов и указателей и массивов.

Графическое представление:

Другие вопросы по тегам