Главная » Просмотр файлов » Керниган и Ритчи - Язык программирования Си

Керниган и Ритчи - Язык программирования Си (793773), страница 29

Файл №793773 Керниган и Ритчи - Язык программирования Си (Керниган и Ритчи - Язык программирования Си) 29 страницаКерниган и Ритчи - Язык программирования Си (793773) страница 292019-04-24СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

Текст из файла (страница 29)

Мы сделали его типа char, чтобы проиллюстрировать законность применениятипа char для малых целых без знака.Массив daytab — это первый массив из числа двумерных, с которыми мы еще не имели дела. Строго говоря,в Си двумерный массив рассматривается как одномерный массив, каждый элемент которого — также массив.Поэтому индексирование изображается так:daytab[i][j] /* [строка] [столбец] */а не так:daytab[i,j] /* НЕВЕРНО */Особенность двумерного массива в Си заключается лишь в форме записи, в остальном его можно трактоватьпочти так же, как в других языках. Элементы запоминаются строками, следовательно, при переборе их в томпорядке, как они расположены в памяти, чаще будет изменяться самый правый индекс.Массив инициализируется списком начальных значений, заключенным в фигурные скобки; каждая строкадвумерного массива инициализируется соответствующим подсписком.

Нулевой столбец добавлен в началоdaytab лишь для того, чтобы индексы, которыми мы будем пользоваться, совпадали с естественныминомерами месяцев от 1 до 12. Экономить пару ячеек памяти здесь нет никакого смысла, а программа, вкоторой уже не надо корректировать индекс, выглядит более ясной.Если двумерный массив передается функции в качестве аргумента, то объявление соответствующего емупараметра должно содержать количество столбцов; количество строк в данном случае несущественно,поскольку, как и прежде, функции будет передан указатель на массив строк, каждая из которых есть массивиз 13 значений типа int, В нашем частном случае мы имеем указатель на объекты, являющиеся массивамииз 13 значений типа int. Таким образом, если массив daytab передается некоторой функции f, то этуфункцию можно было бы определить следующим образом:f(int daytab[2][13]) {…}Вместо этого можно записатьf(int daytab[][13]) {…}поскольку число строк здесь не имеет значения, илиf(int (*daytab)[13]) {…}Последняя запись объявляет, что параметр есть указатель на массив из 13 значений типа int.

Скобки здесьнеобходимы, так как квадратные скобки [] имеют более высокий приоритет, чем *. Без скобок объявлениеint *daytab[13]определяет массив из 13 указателей на char. В более общем случае только первое измерение(соответствующее первому индексу) можно не задавать, все другие специфицировать необходимо.В параграфе 5.12 мы продолжим рассмотрение сложных объявлений.Упражйение 5.8. В функциях day_of_year и month_day нет никаких проверок правильности вводимыхдат. Устраните этот недостаток.5.8. Инициализация массивов указателейНапишем функцию month_name(n), которая возвращает указатель на строку символов, содержащийназвание n-го месяца. Эта функция идеальна для демонстрации использования статического массива.Функция month_name имеет в своем личном распоряжении массив строк, на одну из которых она ивозвращает указатель.

Ниже покажем, как инициализируется этот массив имен.Синтаксис задания начальных значений аналогичен синтаксису предыдущих инициализаций:/* month_name: возвращает имя n-го месяца */char *month_name(int n){static char *name[] = {"Неверный месяц","Январь", "Февраль", "Март","Апрель", "Май", "Июнь","Июль", "Август", "Сентябрь","Октябрь", "Ноябрь", "Декабрь"};return (а < 1 || n > 12) ? name[0] : name[n];}Объявление name массивом указателей на символы такое же, как и объявление lineptr в программесортировки. Инициализатором служит список строк, каждой из которых соответствует определенное место вмассиве.

Символы i-й строки где-то размещены, и указатель на них запоминается в name[i]. Так как размермассива name не специфицирован, компилятор вычислит его по количеству заданных начальных значений.5.9. Указатели против многомерных массивовНачинающие программировать на Си иногда не понимают, в чем разница между двумерным массивом имассивом указателей вроде name из приведенного примера. Для двух следующих определений:int a[10][20];int *b[10];записи а[3][4] и b[3][4] будут синтаксически правильным обращением к некоторому значению типаint. Однако только а является истинно двумерным массивом: для двухсот элементов типа int будетвыделена память, а вычисление смещения элемента а[строка][столбец] от начала массива будетвестись по формуле 20 х строка + столбец, учитывающей его прямоугольную природу.

Для b жеопределено только 10 указателей, причем без инициализации. Инициализация должна задаваться явно —либо статически, либо в программе. Предположим, что каждый элемент b указывает на двадцатиэлементныймассив, в результате где-то будут выделены пространство, в котором разместятся 200 значений типа int, иеще 10 ячеек для указателей. Важное преимущество массива указателей в том, что строки такого массивамогут иметь разные длины.

Таким образом, каждый элемент массива b не обязательно указывает надвадцатиэлементный вектор; один может указывать на два элемента, другой — на пятьдесят, а некоторые ивовсе могут ни на что не указывать.Наши рассуждения здесь касались целых значений, однако чаще массивы указателей используются дляработы со строками символов, различающимися по длине, как это было в функции month_name. Сравнитеопределение массива указателей и соответствующий ему рисунок:char *name[] = {"Неправильный месяц", "Янв", "Февр", "Март"};с объявлением и рисунком для двумерного массива:char aname[][15] = {"Неправ. месяц", "Янв", "Февр", "Март"};Упражнение 5.9.

Перепишите программы day_of_year и month_day, используя вместо индексовуказатели.5.10. Аргументы командной строкиВ операционной среде, обеспечивающей поддержку Си, имеется возможность передать аргументы илипараметры запускаемой программе с помощью командной строки. В момент вызова main получает двааргумента. В первом, обычно называемом argc (сокращение от argument count), стоит количествоаргументов, задаваемых в командной строке. Второй, argv (от argument vector), является указателем намассив символьных строк, содержащих сами аргументы.

Для работы с этими строками обычно используютсяуказатели нескольких уровней.Простейший пример — программа echo ("эхо"), которая печатает аргументы своей командной строки водной строчке, отделяя их друг от друга пробелами. Так, командаecho Здравствуй, мир!напечатаетЗдравствуй, мир!По соглашению argv[0] есть имя вызываемой программы, так что значение а где никогда не бываетменьше 1. Если argc равен 1, то в командной строке после имени программы никаких аргументов нет. Внашем примере argc равен 3, и соответственно argv[0], argv[1] и argv[2] суть строки "echo","Здравствуй," и "мир!".

Первый необязательный аргумент — это argv[1], последний — argv[argc1]. Кроме того, стандарт требует, чтобы argv[argc] всегда был пустым указателем.Первая версия программы echo трактует argv как массив символьных указателей.#include <stdio.h>/* эхо аргументов командной строки: версия 1 */main(int argc, char *argv[]){int i;for (i = 1; i < argc; i++)printf("%s%s", argv[i], (i < argc-1) ? " " : "");printf("\n");return 0;}Так как argv — это указатель на массив указателей, мы можем работать с ним как с указателем, а не как синдексируемым массивом. Следующая программа основана на приращении argv, он приращивается так, чтоего значение в каждый отдельный момент указывает на очередной указатель на char; перебор указателейзаканчивается, когда исчерпан argc.#include <stdio.h>/* эхо аргументов командной строки; версия 2 */main(int argc, char *argv[]){while (--argc > 0)printf("%s%s", *++argv[i], (i < argc-1) ? " " : "");printf("\n");return 0;}Аргумент argv — указатель на начало массива строк аргументов.

Использование в ++аrgv префиксногооператора ++ приведет к тому, что первым будет напечатан argv[1], а не argv[0]. Каждое очередноеприращение указателя дает нам следующий аргумент, на который указывает *argv. В это же время значениеargc уменьшается на 1, и, когда оно станет нулем, все аргументы будут напечатаны.Инструкцию printf можно было бы написать и так:printf((argc > 1) ? "%s " : "%s", *++argv);Как видим, формат в printf тоже может быть выражением.В качестве второго примера возьмем программу поиска образца, рассмотренную в параграфе 4.1, инесколько усовершенствуем ее. Если вы помните, образец для поиска мы "вмонтировали" глубоко впрограмму, а это, очевидно, не лучшее решение. Построим нашу программу по аналогии с grep из UNIXa, т.е.

так, чтобы образец для поиска задавался первым аргументом в командной строке.#include <stdio.h>#include <string.h>#define MAXLINE 1000int getline(char *line, int max);/* find: печать строк с образцом, заданным 1-м аргументом */main(int argc, char *argv[]){char line[MAXLINE];int found = 0;if (argc != 2)printf("Используйте в find образец\п");elsewhile (getline(line, MAXLINE) > 0)if (strstr(line, argv[1]) != NULL) {printf ("%s", line);found++;}return found;}Стандартная функция strstr(s, t) возвращает указатель на первую встретившуюся строку t в строке sили NULL, если таковой в s не встретилось. Функция объявлена в заголовочном файле <string.h>.Эту модель можно развивать и дальше, чтобы проиллюстрировать другие конструкции с указателями.Предположим, что мы вводим еще два необязательных аргумента. Один из них предписывает печатать всестроки, кроме тех, в которых встречается образец; второй — перед каждой выводимой строкой печатать еепорядковый номер.По общему соглашению для Си-программ в системе UNIX знак минус перед аргументом вводитнеобязательный признак или параметр.

Характеристики

Тип файла
PDF-файл
Размер
2,25 Mb
Тип материала
Высшее учебное заведение

Список файлов книги

Свежие статьи
Популярно сейчас
Почему делать на заказ в разы дороже, чем купить готовую учебную работу на СтудИзбе? Наши учебные работы продаются каждый год, тогда как большинство заказов выполняются с нуля. Найдите подходящий учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
7046
Авторов
на СтудИзбе
259
Средний доход
с одного платного файла
Обучение Подробнее