|
Программирование >> Структурное программирование
Глава 5 Для присваивания указателю начального значения можно использовать три значения: О, NULL или адрес объекта того же типа. Присваивание указателю в качестве начального значения О или NULL эквивалентно. Единственным целым, которое может быть присвоено указателю, является 0. Операция адресации & возвращает адрес своего операнда. Операнд операции адресации должен быть переменной; операция адресации не применима к константам, выражениям, которые не возвращают ссылку, и переменным, объявленным с классом памяти register. Операция *, называемая операцией косвенной адресации или операцией разыменования, возвращает значение объекта, на который указывает ее операнд. Это называется разыменованием указателя. Если аргумент вызываемой функции должен ею изменяться, можно в качестве параметра передавать адрес аргумента. Вызванная функция затем может модифицировать значение аргумента в вызывающей функции, используя операцию разыменования *. Функция, принимающая адрес в качестве аргумента, должна в качестве соответствующего формального параметра иметь указатель. Нет необходимости включать в прототипы функций имена указателей; единственное, что нужно включить, - это типы указателей. Имена указателей можно включать с целью документирования, но компилятор их игнорирует. Спецификатор const дает программисту возможность информировать компилятор о том, что значение данной переменной не должно модифицироваться. Компилятор отлавливает попытки модифицировать значения, объявленные как const, и выдает либо предупреждение, либо сообщение об ошибке в зависимости от типа компилятора. Существуют четыре способа передачи в функцию указателя: неконстантный указатель на неконстантные данные, константный указатель на неконстантные данные, неконстантный указатель на константные данные и константный указатель на константные данные. Массивы автоматически передаются ссылкой, использующей указатели, потому что значение имени массива является адресом массива. Чтобы передать по ссылке с использованием указателей один элемент массива, нужно передать адрес этого элемента. В С-Ы- имеется специальная унарная операция sizeof для определения размера массива (или любого другого типа данных) в байтах во время компиляции программы. Если операция sizeof применяется к имени массива, она возвращает как целое общее количество байтов в массиве. Операцию sizeof можно применять к любым именам переменных, типам или константам. К числу арифметических операций, которые можно выполнять над указателями, относятся инкремент (++) указателя, декремент указателя (-), сложение (+ или += ) указателя и целого, вычитание (- или -= ) указателя и целого и вычитание одного указателя из другого. При сложении или вычитании указателя и целого указатель увеличивается или уменьшается на величину, равную произведению этого целого на размер указанного объекта. Арифметические операции могут выполняться только с указателями, указываюш;ими на смежные участки памяти, такие, как массив. Все элементы массива хранятся в памяти непосредственно друг за другом. При выполнении арифметических операций над указателем на массив символов результаты не отличаются от обычной арифметики, потому что каждый символ хранится в одном байте памяти. Указатели можно присваивать один другому, если оба указателя одного и того же типа. В противном случае нужно использовать приведение типов. Исключением из этого правила является указатель на void, который является общим зказателем, способным представлять указатели любого типа. Указателю на void можно присваивать все типы указателей без приведения типа. Однако указатель на void может быть присвоен указателю другого типа только явным приведением к типу соответствующего указателя. Указатель на void не может быть разыменован. Указатели можно сравнивать, используя операции проверки на равенство и отношения. Сравнение указателей имеет смысл только в случае, если они указывают на элементы одного и того же массива. Указатели можно индексировать точно так же, как имена массивов. Имя массива эквивалентно указателю на первый элемент массива. В записи указатель-смещение смещение - это то же самое, что индекс массива. Все выражения с индексами массива можно записать с помощью указателя и смещения, используя либо имя массива как указатель, либо отдельный указатель, указывающий на массив. Имя массива - это постоянный указатель, который всегда указывает на одну и ту же ячейку памяти. Но в отличие от обычных указателей имена массивов нельзя изменять. Можно использовать массивы указателей. Можно использовать указатели на функции. Указатель на функцию - это адрес, по которому расположен код функции. Указатели на функции можно передавать функциям, возвращать из функций, хранить в массивах и присваивать другим указателям. Типичным применением указателей на функции являются так называемые системы, управляемые меню. Указатели на функции используются для вызова функций, выбираемых с помощью отдельных разделов меню. Глава 5 Функция strcpy копирует свой второй аргумент - строку в свой первый аргумент - массив символов. Программист должен быть уверен, что массив достаточно велик, чтобы хранить строку и ее завершающий нулевой символ. Функция strncpy эквивалентна strcpy, за исключением того, что в вызове strncpy указывается количество символов, которое должно быть скопировано из строки в массив. Завершающий нулевой символ будет копироваться, только если количество символов, которое должно быть скопировано, по крайней мере на один больше длины строки. Функция strcat добавляет свой второй аргумент - строку к своему первому аргументу - массиву символов, содержащему строку. Первый символ второго аргумента замещает нулевой символ (\0), который завершал строку в первом аргументе. Программист должен быть уверен, что массив, используемый для хранения первой строки, достаточно велик для того, чтобы хранить комбинацию первой строки и второй строки. Функция strncat добавляет указанное количество символов из второй строки в первую строку. К результату добавляется завершающий нулевой символ. Функция stremp сравнивает символ за символом строку в своем первом аргументе со строкой в своем втором аргументом. Функция возвращает О, если строки равны, отрицательное значение, если первая строка меньше, чем вторая, и положительное значение, если первая строка больше, чем вторая. Функция strncmp эквивалентна stremp, за исключением того, что strncmp сравнивает указанное количество символов. Если количество символов одной из строк меньше чем указанное количество символов, strncmp сравнивает символы до тех пор, пока не встретится нулевой символ в более короткой строке. Последовательные вызовы функции strtok разбивают строку на лексемы, разделенные символами, содержащимися во втором аргументе - строке. При первом вызове в качестве первого аргумента передается строка, разбиваемая на лексемы, а при последующих вызовах, продолжающих разбиение на лексемы той же самой строки, в качестве первого аргумента передается NULL. При каждом вызове возвращается указатель на текущую лексему. Если при вызове strtok лексем больше нет, возвращается NULL. Функция strlen получает в качестве аргумента строку, а возвращает количество символов в строке; завершающий нулевой символ в длину строки не входит. Терминология ASCII stremp const strcpy EBCDIC strihg.h sizeof strlen strcat strncat
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |