Вложенные индексы в одной скобке массива - PullRequest
3 голосов
/ 06 марта 2020

Я никогда не видел ничего подобного и уже читал массивы. Массив имеет 2 индекса в скобках, из которых один вложен в другую скобку:

printf("%d ", arr[chosen[i]]); 

Я не знаю, что произойдет, если в скобках 2 индекса.

Весь код здесь: https://www.geeksforgeeks.org/combinations-with-repetitions/

Ответы [ 4 ]

3 голосов
/ 06 марта 2020

Индексация напрямую с использованием массива int с именем chosen.

printf("%d ", arr[chosen[i]]); 

Или косвенная индексация путем сохранения значения вначале - то же самое.

int idx = chosen[i];
printf("%d ", arr[idx]); 
2 голосов
/ 06 марта 2020
printf("%d ", arr[chosen[i]]);

chosen[i] соответствует значению, которое хранится в (i + 1). элемент массива chosen.

Но мне нужно больше данных для иллюстрации случая. Итак, давайте предположим, что следующие инициализации:

int i = 2;
int chosen[4] = {1,5,7,9}
int arr[9] = {6,2,7,23,9,16,11,44,2};

Предполагая, что i равно 2, chosen[i] указывает на третий элемент массива chosen и оценивается в значение 7. Еще одно повторение ради обучения: chosen[i] оценивается как 7, если i равно 2. Обратите внимание, что подсчет индекса начинается с 0, поэтому chosen[2] означает третий элемент массива chosen, а не второй.

После этого 7 будет использоваться для определения 8-го элемента массива arr, a[7]; a[7] = 8-й элемент arr.

Внутри a[7] у нас есть значение 44. Таким образом, в итоге мы печатаем 44 по:

printf("%d ", arr[chosen[i]]);

Итак,

printf("%d ", arr[chosen[i]]); 

в нашем примере эквивалентно:

printf("%d ", arr[7]);

Чтобы продемонстрировать отношение в другой раз:

chosen[i] = NUMBER;
buffer = chosen[i];
printf("%d ", arr[buffer]);

эквивалентно

buffer = NUMBER;
printf("%d ", arr[buffer]);

, что также эквивалентно

count[i] = NUMBER;
printf("%d ", arr[count[i]);

и, конечно, эквивалентно:

printf("%d ", arr[NUMBER]);
1 голос
/ 06 марта 2020

Вам просто нужно разбить код, по одному шагу за раз.

Оба chosen и arr объявлены как массивы целых чисел; Итак, работая «изнутри», мы сначала оцениваем chosen[i] - это будет (целочисленный) элемент массива chosen в позиции (индексе), заданной i.

Давайте вызовите это значение chosen_int.

Затем мы можем переписать выражение arr[chosen[i]] как arr[chosen_int], которое будет (целочисленным) элементом массива arr при значении индекса, заданном нашим предыдущее (внутреннее) выражение.

Может помочь в явном виде записать то, что мы только что сделали, заменив «запутанный» однострочный код следующим:

int chosen_int = chosen[i];
printf("%d ", arr[chosen_int]);

Не стесняйтесь просить дальнейших разъяснений и / или объяснений.

0 голосов
/ 06 марта 2020

Просто чтобы добавить что-то в другие ответы.

Я никогда не видел ничего подобного ...
printf ("% d", arr [selected [i]]);

Это (что вы никогда не видели этого) звучит для меня очень странно, но это может произойти.

В этом нет ничего странного: если вы думаете, нет никакой двусмысленности , Одиночная пара скобок содержит индекс; этот индекс снова выражается с помощью обозначения массива.

Может быть полезно изменить порядок массивного массива. Предположим, у вас есть массив, содержащий длинные структуры. Чтобы отсортировать его, вы должны поменять местами большие объекты. Но вы можете сортировать его, меняя его индексы вместо самих объектов. Или, может быть, вы хотите сохранить в памяти разные упорядоченные списки, все из которых содержат индексы в одном массиве.

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