Если у меня был массив размером 10 с базовым адресом, скажем 0x5600bc
. Каким будет расположение памяти каждого элемента массива и ptr
?Карта памяти массива
Ех: Что такое Arr[0]
Адрес, было бы 0x5600bc
? & это сделает Arr[1]
be 0x5600c0
?
Если у меня был массив размером 10 с базовым адресом, скажем 0x5600bc
. Каким будет расположение памяти каждого элемента массива и ptr
?Карта памяти массива
Ех: Что такое Arr[0]
Адрес, было бы 0x5600bc
? & это сделает Arr[1]
be 0x5600c0
?
Местоположение Arr[n]
будет 0x5600bc + n*sizeof(Arr[0])
. Поэтому, если размер элементов массива равен 4
, Arr[1]
действительно будет на 0x5600c0
.
Имя массива (идентификатор) на самом деле является указателем на его первый элемент, поэтому ответ Arr[0]
равен 0x5600bc
. В зависимости от type
массива и, более конкретно, его element size
(в байтах) будет определять приращение адреса каждого следующего элемента.
В общем, используется режим Indirect addressing, где у вас есть: base address + offset
, где base = array name
, offset = (element size)*(index of element)
Большие объяснения arrays и pointer and arrays.
Графическое представление:
Учитывая
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;
}
По 'foo [0] + sizeof typename', вы имеете в виду' (uintptr_t) & foo [0] + sizeof typename' –
Да. Я добавлю, что это будет яснее. –
Массив что? – ouah
Нам нужно знать, что такое тип массива, и какой размер этого типа на вашем компьютере. –
Вы можете проверить это с помощью любой IDE, такой как Visual Studio и Eclipse. – farukdgn