Стивен Прата - Язык программирования C. Лекции и упражнения (6-е изд.) 2015

Тут можно читать онлайн Стивен Прата - Язык программирования C. Лекции и упражнения (6-е изд.) 2015 - бесплатно полную версию книги (целиком) без сокращений. Жанр: Прочая старинная литература, издательство Вильямс, год 0101. Здесь Вы можете читать полную версию (весь текст) онлайн без регистрации и SMS на сайте лучшей интернет библиотеки ЛибКинг или прочесть краткое содержание (суть), предисловие и аннотацию. Так же сможете купить и скачать торрент в электронном формате fb2, найти и слушать аудиокнигу на русском языке или узнать сколько частей в серии и всего страниц в публикации. Читателям доступно смотреть обложку, картинки, описание и отзывы (комментарии) о произведении.

Стивен Прата - Язык программирования C. Лекции и упражнения (6-е изд.) 2015 краткое содержание

Язык программирования C. Лекции и упражнения (6-е изд.) 2015 - описание и краткое содержание, автор Стивен Прата, читайте бесплатно онлайн на сайте электронной библиотеки LibKing.Ru

Язык программирования C. Лекции и упражнения (6-е изд.) 2015 - читать онлайн бесплатно полную версию (весь текст целиком)

Язык программирования C. Лекции и упражнения (6-е изд.) 2015 - читать книгу онлайн бесплатно, автор Стивен Прата
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

• Инкрементирование указателя. Инкрементирование указателя на элемент массива приводит к его перемещению на следующий элемент массива. Таким образом, операция ptrl++увеличивает числовое значение ptrl на 4 (4 байта для типа int в нашей системе) и указатель ptrl будет ссылаться на urn[l] (на рис. 10.4 приведена иллюстрация с применением упрощенных адресов). Теперь ptrl имеет значение 0x7fff5fbff8d4 (адрес следующего элемента в массиве), a *ptrl — значение 200 (значение urn[l]). Обратите внимание, что адресом самого ptrl остается 0x7fff5fbff 8c8. В конце концов, переменная не перемещается в памяти лишь потому, что изменилось ее значение!

Рис 104 Инкрементирование указателя на int Вычитание целого числа из - фото 303

Рис. 10.4. Инкрементирование указателя на int

• Вычитание целого числа из указателя. Посредством операции - можно вычитать целое число из указателя; указатель должен быть первым операндом, а целое число — вторым. Целое число умножается на количество байтов в типе, на который указывает указатель, и результат вычитается из исходного адреса. Это делает ptr3 - 2 эквивалентным &urn [2], т.к. ptr3 указывает на &urn [4]. Результат вычитания не определен, если он находится за пределами массива, на который указывает исходный указатель; исключением будет адрес, следующий за последним элементом массива, который считается допустимым.

• Декрементирование указателя. Разумеется, указатель можно также декрементировать. В приведенном примере декрементирование ptr2 приводит к тому, что он указывает на второй элемент массива вместо третьего. Обратите внимание, что можно использовать как префиксную, так и постфиксную форму операций инкремента и декремента. Также следует отметить, что перед восстановлением исходных значений ptrl и ptr2 указывали на один и тот же элемент, urn [1].

глава Ю

картинка 304• Разность. Вы можете находить разность между двумя указателями. Обычно это делается для двух указателей на элементы, находящиеся в одном массиве, чтобы определить, насколько далеко они отстоят друг от друга. Результат представлен в тех же единицах, что и размер типа. Например, в выводе программы из листинга 10.13 выражение ptr2 - ptrl имеет значение 2, т.е. эти указатели ссылаются на объекты, которые отделены друг от друга двумя значениями int, а не двумя байтами. Вычитание является гарантированно допустимой операцией при условии, что оба указателя ссылаются на значения внутри одного и того же массива (или, возможно, на позицию за последним элементом массива). Применение этой операции к указателям в двух разных массивах может дать какое-то значение или привести к ошибке во время выполнения.

• Сравнение. Для сравнения значений двух указателей можно использовать операции отношений при условии, что указатели имеют один и тот же тип.

Обратите внимание на существование двух форм вычитания. Можно вычитать один указатель из другого и получать целое число, а также можно вычитать целое число из указателя и получать указатель.

При выполнении инкрементирования и декрементирования указателя необходимо соблюдать определенные меры предосторожности. Компьютер не отслеживает, продолжает ли указатель ссылаться на элемент в массиве. Язык С гарантирует допустимость указателя, если он ссылается на любой элемент заданного массива или на позицию, следующую за последним элементом массива. Но результат инкрементирования или декрементирования указателя, который выходит за эти пределы, не определен. Кроме того, можно разыменовать указатель на любой элемент массива. Однако, несмотря на допустимость указателя, ссылающегося на позицию после конца массива, возможность его разыменования не гарантируется.

Разыменование неинициализированного указателя

Говоря об осторожности, существует одно правило, о котором вы не должны забывать: никогда не разыменовывайте неинициализированный указатель! Например, взгляните на следующий код:

int * pt; // неинициализированный указатель *pt =5; // катастрофическая ошибка

Почему здесь все настолько плохо? Вторая строка означает сохранение значения 5 в ячейке, на которую указывает pt. Но pt, будучи неинициализированным, имеет случайное значение, поэтому неизвестно, куда будет помещено 5. Это может не причинить вреда, перезаписать данные или код либо вызвать аварийное завершение программы. Вспомните, что создание указателя приводит к выделению памяти только под сам указатель; для хранения данных память не выделяется. Таким образом, перед использованием указателю должен быть присвоен адрес ячейки памяти, которая уже была выделена. Например, указателю можно присвоить адрес существующей переменной. (Именно это происходит во время применения функции с параметром типа указателя.) Либо жв можно воспользоваться функцией malloc() для предварительного выделения памяти, как обсуждается в главе 12. В любом случае, во избежание проблем, никогда не разыменовывайте неинициализированный указатель!

double * pd; // неинициализированный указатель

• pd = 2.4; //НЕ ПОСТУПАЙТЕ ТАК!

Предположим, что есть такой код:

int urn[3];

int * ptrl, * ptr2;

Массивы и указатели 393

Ниже приведены примеры допустимых и недопустимых операторов:

Допустимые операции открывают множество возможностей Программисты на С создают - фото 305

Допустимые операции открывают множество возможностей. Программисты на С создают массивы указателей, указатели на функции, массивы указателей на указатели, массивы указателей на функции и т.п. Однако мы будем придерживаться базовых случаев применения указателей, которые рассматривались выше. Первый базовый случай использования указателей связан с передачей информации в и из функций. Вы уже знаете, что для воздействия внутри функции на переменные из вызывающей функции должны применяться указатели. Второй случай использования касается функций, предназначенных для манипулирования массивами. Давайте взглянем на еще один пример, в котором применяются функции и массивы.

Защита содержимого массива

При написании функции, которая обрабатывает фундаментальный тип вроде int, у вас есть выбор между передачей данных int nо значению и передачей указателя на тип int. Обычно числовые данные передаются по значению, если только программа не нуждается в изменении этого значения — в таком случае передается указатель. Массивы не предоставляют подобного выбора; вы обязаны передавать указатель. Все дело в эффективности. Если бы массив передавался по значению, пришлось бы выделять в памяти пространство, достаточное для сохранения копии исходного массива, и затем копировать все данные из исходного массива в новый. Намного быстрее передать адрес массива и заставить функцию работать с исходными данными.

Читать дальше
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать


Стивен Прата читать все книги автора по порядку

Стивен Прата - все книги автора в одном месте читать по порядку полные версии на сайте онлайн библиотеки LibKing.




Язык программирования C. Лекции и упражнения (6-е изд.) 2015 отзывы


Отзывы читателей о книге Язык программирования C. Лекции и упражнения (6-е изд.) 2015, автор: Стивен Прата. Читайте комментарии и мнения людей о произведении.


Понравилась книга? Поделитесь впечатлениями - оставьте Ваш отзыв или расскажите друзьям

Напишите свой комментарий
x