Я только начал учиться программировать на C, и чтобы улучшить мое понимание указателей и массивов, я попытался ссылаться на элементы массива, не создавая вообще никакого указателя:
for(k1 = 0; k1 < ROW; k1++){
for(k2 = 0; k2 < COLUMN; k2++){
array[k1][k2] = k1*COLUMN + k2 + 1;
printf("[%d][%d] = %d\n", k1, k2, *(array[k1] + k2));
}
}
Весь код компилируется и работает без нареканий.
Я представляю, что создание указателя для каждого отдельного массива в большом исходном коде кажется крайне неэффективным.
Таким образом, вместо того, чтобы хранить и извлекать адрес массива с помощью указателя, является ли плохой практикой программирования использовать адрес массива напрямую, как показано выше?
programming-practices
c
Нико Гамбт
источник
источник
printf "[%d][%d] = %d\n", k1, k2, array[k1] [k2]));
позволит избежать арифметики указателя и будет проще для понимания.Ответы:
Это «плохо» только в той степени, в которой это менее читабельно.
a[x]
это то же самое*(a+x)
, так что нет никакой разницы в эффективности или поведении (на самом деле,x[a]
также будет работать). Просто это,a[x]
как правило, намного более интуитивно понятно для нас, людей.Но это не значит, что читаемость не имеет большого значения. Чтобы увидеть, насколько они велики, подумайте, как бы вы «прочитали» эти два выражения, если бы увидели их в коде:
*(a+x)
= "То, на что указывает сумма указателяa
и целого числаx
"a[x]
= "x
Той член массиваa
"Точно так же, когда вам нужно обратиться к адресу элемента массива:
(a+x)
= "Сумма указателяa
и целого числаx
"&a[x]
= "Адресx
th-го элемента массиваa
"В большинстве случаев
[]
версии легче понять, когда вы смотрите на нетривиальный код, работающий с несколькими различными массивами (особенно с массивами массивов). Вот почему[]
оператор существует в первую очередь.PS Делать такие вещи строго как учебное упражнение - очень хорошая идея. Важно понимать, что массивы - это просто указатели и смещения.
источник
Да, это плохая практика, но не по причинам неэффективности.
Оператор Array использует арифметику указателя под капотом, поэтому они одинаково эффективны.
Проблема с арифметикой указателей в том, что она очень подвержена ошибкам и труднее для чтения.
Правило большого пальца: не используйте арифметику указателя без необходимости.
источник
Охладите свое обучение, вы только что обнаружили один из маленьких скороговорок. Вы делаете не арифметику указателей над массивом, а массив указателей. Делать арифметику указателей на массивах невозможно. Массив распадается на указатель, но сам по себе не является указателем. Что у вас есть (см. Комментарий cmaster)
Разыменование этого указателя дает значение, на которое указывает только что рассчитанный вами указатель. Как правило, нет смысла делать то, что вы делаете. Но вы можете линеаризовать массив, а затем шагать по нему, вот так.
Страйд у нее есть x_dim. Надеюсь, мой ответ проясняется!
источник
int* array[ROW];
int array[ROW][COLUMN];
int (*array)[COLUMN];