В Java нет арифметики указателей. Это то, о чем вы спрашиваете. Например, представьте, что malloc
возвращает указатель типа int
int* malloc(size_t size)
{
//
}
Возможно, вы получите указатель, который в основном является указателем на array
. Тогда вы будете индексировать его как обычные массивы.
int* arr = malloc(10 * sizeof(int)); // 10 contiguous int(s).
Проблема в том, что C
не перегружает функции. Итак, мы должны найти способ написать универсальный malloc
. В противном случае вы получите разные malloc
для каждого типа. Решение состоит в том, чтобы отправить необходимое количество байтов, которое вам нужно. Затем вы можете индексировать его так, как вам нравится. Это дает большую гибкость и решение для всех.
int* i = (int*)malloc(10 * sizeof(int)); // 40 bytes if int = 4 bytes
char* c = (char*)malloc(10 * sizeof(char)); // 10 bytes if char = 1 byte
int thirdElement = i[3]; // third element. 12 bytes away from (*i)
char secondElement = c[2]; // second element. 2 bytes away from (*c)
Итак, вся идея в том, что не имеет значения, как мы индексируем память, которую мы получили от malloc
. Все, что нам нужно сделать, это указать тип вновь созданного массива, чтобы правильно его проиндексировать. void*
означает, что это указатель для размещения в памяти, который мы не указали, как индексировать.