2014-08-30 3 views
1

Предположим, что я хочу выполнить следующее действие в C. Есть ли способ сделать это более эффективно с указателями (просто из интереса, так как я нахожусь в процессе обучения C). Благодаря!C - Переместить элементы массива с помощью указателей

int my_array[5]; 

my_array[0] = my_array[1]; 
my_array[1] = my_array[2]; 
my_array[2] = my_array[3]; 
my_array[3] = my_array[4]; 
my_array[4] = my_array[5]; 
my_array[5] = 0; 
+0

С современными компиляторами код индексирования массива и код указателя часто заканчиваются почти идентичным машинным кодом. Просто укажите это так, как это имеет смысл. Я голосую за 'for (int i = 0; i <5; i ++) my_array [i] = my_array [i + 1]; my_array [5] = 0; '. – Gene

+1

вы не можете использовать 'my_array [5]' – BLUEPIXY

ответ

3

использование memmove.

memmove(&my_array[0], &my_array[1], 5 * sizeof(my_array[0])); 
my_array[5] = 0; 

Может быть, это самый эффективный способ, потому что в большинстве случае memmove осуществляется специальным машинным кодом (например rep movsd х86, или SSE ..)

(Обратите внимание, что вы не можете использовать memcpy, .., потому что источник и адресат является перекрыванием Если вы используете тетср, неопределенного поведения бы придумать)

Если вы хотите скопировать maually через указатель, вы можете это:

int *p; 
for (p = my_array; p < my_array + 5; p++) 
    *p = *(p + 1); 
*p = 0; 
+0

Спасибо редактору, я сделал * огромную ошибку * o < – ikh

1

Вы можете сделать, как это ...

for(i=0;i<5;i++) 
my_array[i]=my_array[i+1]; 
my_array[i]=0; 

В концепции массива самый индекс меньше 1 из элементов не в том, что array.Here ваших элементов массива 5, но вы пытаетесь для доступа к 5-му индексу массива my_array[5]. Предположим, что если вы выполните эту операцию после инициализации массива, вы получите значение мусора в 4-м индексе массива.

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