Функция обращения массива - C (СИ)
Формулировка задачи:
Составьте функцию revarray, переставляющую элементы любого массива в обратном порядке. Функция должна быть объявлена как
void revarray(void *base, unsigned long nel, unsigned long width)
{
...
}
Здесь параметр base означает указатель на начало массива, nel – количество элементов в массиве, а width – размер каждого элемента массива в байтах.
Проверка работоспособности функции revarray будет осуществляться путём присоединения её к программе вида
#include <stdio.h>
int array[] = {
1000000000,
2000000000,
3000000000,
4000000000,
5000000000
};
void revarray(void*, unsigned long, unsigned long);
int main(int argc, char **argv)
{
revarray(array, 5, sizeof(int));
int i;
for (i = 0; i < 5; i++) {
printf("%d\n", array[i]);
}
return 0;
}Решение задачи: «Функция обращения массива»
textual
Листинг программы
void revarray(void* ptr, unsigned long size, unsigned long bytes)
{
for (int i=0, j=(size-1)*bytes; i<j; i+=bytes, j-=bytes)
for(int k=0; k<bytes; k++) {
*(((char*)ptr)+i+k)^=*(((char*)ptr)+j+k);
*(((char*)ptr)+j+k)^=*(((char*)ptr)+i+k);
*(((char*)ptr)+i+k)^=*(((char*)ptr)+j+k);
}
}
Объяснение кода листинга программы
- В данном коде представлена функция revarray, которая принимает три аргумента: ptr (указатель на массив), size (размер массива в элементах) и bytes (размер одного элемента в байтах).
- Внутри функции используется два вложенных цикла. Первый цикл идет от 0 до (size-1)*bytes, а второй - от 0 до bytes.
- В каждой итерации внутреннего цикла происходит обмен значений между указателями ptr[i] и ptr[j], где i и j меняются на противоположные значения.
- Операция обмена реализуется с помощью оператора XOR (^).
- В каждой итерации внешнего цикла происходит смещение указателя ptr на размер одного элемента в байтах.
- Таким образом, после выполнения функции revarray, элементы массива будут перевернуты.