Найти в Дзене
Old Programmer

Программирование на языке C. Двумерный массив. Доступ к элементам по индексу и указателю

Все ссылки на статьи и ролики моего канала Old Programmer:
Программирование. Тематическое оглавление моего Zen-канала (Old Programmer). Все материалы о C/C++ здесь.

  • Список разделов канала Old Programmer, канала о программировании и программистах

Сегодня вернемся к моему любимому языку C. Речь пойдет о двумерных массивах. Надо сказать, что язык C часто называют языком среднего уровня из-за той роли, которая там придается указателям. Ведь указатель это, в сущности, прямой доступ к памяти. А это, в свою очередь, источник многочисленных ошибок.

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

Доступ к элементам двумерного массива на языке C (индекс и указатель)

Рассмотрим программу ar4000.c. У нас есть массив a, я взял его глобальным, хотя это и не принципиально. Каждому элементу массива (3 на 3) присваивается некоторое целое число. Обращаю внимание, что для доступа к элементам массива я использую квадратные скобки. Поскольку массивы в языке C все таки есть, то почему бы и не воспользоваться этим. Но определенные проблемы возникают при передаче массива в функцию. Обычно в этом случае оперируют уже просто указателем. В нашей программе в функции main элементы массива выводятся обычным способом, с использованием обозначений для массивов. Потом указатель на массив (на первый элемент массива) передается в функцию prarr, где элементы выводятся уже с помощью указателя. Если мы запустим программу, то результат будет одинаковым.

1 2 3
4 5 6
7 8 9
1 2 3
4 5 6
7 8 9

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

Перейдем теперь к следующему эксперименту. Ошибка, которую мы сейчас увидим очень часто возникает, когда исправляется уже готовая программа. Часто в программировании для массивов резервируется некоторый излишек. Скажем, например, мы знаем, что размеры массивы могут меняться в некотором интервале. Так почему же в этом случае не зарезервировать массив по максимуму? Так часто и делают. Рассмотрим программу ar4010.c. Здесь зарезервирован массив 5 на 5, но используется только его часть - 3 на 3. И вроде бы все правильно, ведь элемент массива определяется номером строки и столбца. И действительно, вывод массива (3 на 3) в функции main дает верный результат. А далее мы передаем указатель на первый элемент в функцию prarr. И вот тут мы видим, что результат вывода массива будет не правильный. Суть ошибки заключается в том, что длина строк равно не 3, а 5. Но если мы используем типовое обозначение для элементов массива, то компилятор, зная о реальном размере массива (длина строки для него именно 5), делает все правильно. А в функции prarr мы считаем, что длина строки 3 и, естественно допускаем ошибку. Компилятор в данном случае не понимает, что мы на самом деле хотим.

Ошибка, описанная выше встречается довольно часто. Обычно старые программисты на языке C говорят: используйте динамическую память. Это кстати и ресурсы вам сэкономит. В программе ar4020.c мы выделяем необходимую память для двумерного массива, а далее, зная его реальные размеры (без всяких излишек) мы работаем с ним по указателю.

Что ж, - скажете вы, не использовать стандартные обозначения для массивов, а переходить полностью на указатели? Да это было бы не плохим выходом при программировании на языке C.

Указатели штука особенная. К ним надо привыкнуть, а привыкнув, вы влюбитесь в язык C.

До свидания. Получайте удовольствие от программирования на языке Си и подписывайтесь на мой канал Old Programmer. И вы забыли поставить 'ЛАЙК', не так ли?

Программа ar4020.c
Программа ar4020.c

Рекомендуем почитать
Документы, вакансии и контакты