Цитата
Подскажите спецы кто как работает в Си. Можно работать с массивами и указателями. Что эффективней?
Я стараюсь работать только с указателями. При программировании для МК это несколько экономит ресурсы. Допустим, есть некая структура:
Код
typedef struct { int id; void * p; } some_struct_t;
и есть некая константа, задающая размер буфера (читай: массива):
Код
enum { some_buffer_size = 20 };
Разместим сам буфер:
Код
some_struct_t some_buffer[some_buffer_size];
Теперь вариант перебора с применением индекса:
Код
int i;
for (i = 0; i < some_buffer_size; ++i) {
printf("%i %p\n", some_buffer[i].id, some_buffer[i].p);
}
Перебор с применением указателя:
Код
some_struct_t * p;
for (p = some_buffer; p < some_buffer+some_buffer_size; ++p) {
printf("%i %p\n", p->id, p->p);
}
Как видим, в первом случае индексирование выполняется дважды за цикл, т.е. всего 40 раз! А что есть индексирование? Это умножение(!) индекса на размер элемента массива и суммирование его с указателем на массив. Конечно, в случае массива символов размер элемента массива == 1, так что можно просто прибавлять индекс к адресу массива, но в случае массивов с размером элементов в 5 байт придётся именно умножать.
Во втором же случае размер элемента массива просто прибавляется к текущему значению указателя, что может быть на порядок (а то и 2 порядка) эффективнее.
С другой стороны, если не требуется итерация по всему буферу, а нужен именно произвольный доступ к элементу с определённым индексом, то можно с одинаковым успехом воспользоваться обоими методами, как и показал
sensor_ua.
Цитата
Массив имеет длину и её можно узнать.
Это что-то новое. Размер массива в Си, вообще говоря, невозможно узнать динамически. Соответственно, код, сгенерированный компилятором, не имеет возможности детектировать выход за пределы массива. Если Вы имеете ввиду
sizeof() , то он возвращает размер объекта в байтах, что обычно не то, что нужно в повседневной жизни. Более того, полагаться на этот оператор просто опасно. В различных компиляторах он может выдавать различные значения благодаря различному выравниванию элементов. Если массив размещается статически, то всегда заводите константу, содержащую его размер и пользуйтесь только ею для задания и определения размера массива. Если массив размещается динамически, то определите переменную (а ещё лучше - функцию) для определения его размера. Для изменения размера определите соотвествующую функцию.