изменение индекса массива - PullRequest
2 голосов
/ 16 августа 2010

Пока я работаю над массивом с 0-м местоположением, но мне нужно изменить его с 0 на 1, так что если раньше он начинался с 0 до n-1, то теперь он должен начинаться с 1 до n. Есть ли выход для решения этой проблемы?

Ответы [ 5 ]

6 голосов
/ 16 августа 2010

C массивы начинаются с нуля и всегда будут.Я настоятельно рекомендую придерживаться этого соглашения.Если вам действительно нужно обработать первый элемент как имеющий индекс 1 вместо 0, вы можете заключить обращения к этому массиву в функцию, которая выполняет перевод для вас.сделать это?Какую проблему вы пытаетесь решить?

5 голосов
/ 16 августа 2010

Индексирование массива начинается с нуля в C;Вы не можете это изменить.

Если у вас есть конкретные требования / сценарии проектирования, в которых имеет смысл начинать индексы с одного, объявите массив длиной n + 1 и просто не используйте нулевую позицию.

3 голосов
/ 16 августа 2010

Вычитайте 1 из индекса каждый раз, когда вы получаете доступ к массиву, чтобы выполнить индексацию на основе «поддельной 1».

Если вы хотите изменить нумерацию во время работы программы, вы запрашиваете что-то большеечем просто обычный массив.Если вещи когда-либо сдвигаются только на одну позицию, выделите (n + 1) слотов и используйте указатель на массив.

enum { array_size = 1000 };

int padded_array[ array_size + 1 ];
int *shiftable_array = padded_array; /* define pointer */

shiftable_array[3] = 5; /* pointer can be used as array */
some_function( shiftable_array );

/* now we want to renumber so element 1 is the new element 0 */
++ shiftable_array; /* accomplished by altering the pointer */

some_function( shiftable_array ); /* function uses new numbering */

Если операция сдвига на один повторяется бесконечно, вам может потребоватьсяреализовать круговой буфер .

1 голос
/ 16 августа 2010

Вы не можете.

Ну, на самом деле вы можете, но вы должны немного подправить. Определите массив, а затем используйте указатель на перед первым элементом. Затем вы можете использовать индексы от 1 до n из этого указателя.

int array[12];
int *array_starts_at_one = &array[-1]; // Don't use index 0 on this one
array_starts_at_one[1] = 1;
array_starts_at_one[12] = 12;

Но я бы посоветовал против сделать это.

0 голосов
/ 16 августа 2010

Еще несколько аргументов, почему массивы основаны на нуле, можно найти здесь . Infact его одна из очень важных и хороших особенностей языка программирования C. Тем не менее, вы можете реализовать массив и начать индексирование с 1, но это действительно займет много усилий, чтобы отследить.

Скажем, вы объявляете целочисленный массив

int a[10];
for(i=1;i<10;i++)
a[i]=i*i;

Вам необходимо получить доступ ко всем массивам с индексом 1. Конечно, вы должны объявить с размером (REQUIRED_SIZE_NORMALLY+1). Здесь вы также должны отметить, что вы все еще можете получить доступ к элементу a[0], но вы должны игнорировать его из своей головы и своего кода, чтобы достичь того, чего вы хотите.

Еще одна проблема - для человека, читающего ваш код. Он сходил с ума, пытаясь выяснить, почему нумерация начиналась с 1, а 0-й индекс использовался для какой-то скрытой цели, о которой, к сожалению, он не знает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...