2015-04-29 3 views
1

Если у меня был массив размером 10 с базовым адресом, скажем 0x5600bc. Каким будет расположение памяти каждого элемента массива и ptr?Карта памяти массива

Ех: Что такое Arr[0] Адрес, было бы 0x5600bc? & это сделает Arr[1] be 0x5600c0?

+2

Массив что? – ouah

+0

Нам нужно знать, что такое тип массива, и какой размер этого типа на вашем компьютере. –

+0

Вы можете проверить это с помощью любой IDE, такой как Visual Studio и Eclipse. – farukdgn

ответ

2

Местоположение Arr[n] будет 0x5600bc + n*sizeof(Arr[0]). Поэтому, если размер элементов массива равен 4, Arr[1] действительно будет на 0x5600c0.

0

Имя массива (идентификатор) на самом деле является указателем на его первый элемент, поэтому ответ Arr[0] равен 0x5600bc. В зависимости от type массива и, более конкретно, его element size (в байтах) будет определять приращение адреса каждого следующего элемента.

В общем, используется режим Indirect addressing, где у вас есть: base address + offset, где base = array name, offset = (element size)*(index of element)

Большие объяснения arrays и pointer and arrays.

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

4

Учитывая

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; 
} 
+0

По 'foo [0] + sizeof typename', вы имеете в виду' (uintptr_t) & foo [0] + sizeof typename' –

+0

Да. Я добавлю, что это будет яснее. –

Смежные вопросы