КАТЕГОРИИ:
АстрономияБиологияГеографияДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРиторикаСоциологияСпортСтроительствоТехнологияФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника
|
Вызов функции ⇐ ПредыдущаяСтр 6 из 6 Для обращения к функции используется имя функции. Формат вызова: Имя_функции (список); , где список представляет собой список фактических аргументов, передаваемых в функцию. Этот список может быть и пустым, но наличие круглых скобок обязательно. Фактический аргумент может быть величиной любого простого типа, структурой, объединением, перечислением или указателем на объект любого типа. Массив и функция не могут быть использованы в качестве фактических аргументов, но можно использовать указатели на эти объекты. Выполнение вызова функции происходит следующим образом. Вычисляются выражения в списке фактических аргументов. Затем, если известен прототип функции, тип полученного фактического параметра сравнивается с типом соответствующего формального параметра. Если они не совпадают, то либо производится преобразование типов, либо формируется сообщение об ошибке. Число выражений в списке фактических аргументов должно совпадать с числом формальных параметров, если только функция не имеет переменного числа параметров. В последнем случае проверке подлежат только обязательные параметры. Если в прототипе функции указано, что ей не требуются параметры, а при вызове они указаны, формируется сообщение об ошибке. Происходит присваивание значений или адресов фактических аргументов соответствующим формальным параметрам. Управление передается на первый оператор функции. Выполняются действия, указанные в теле функции. Выполнение оператора return в теле функции возвращает управление и вычисленное значение в вызывающую функцию. При отсутствии оператора return управление возвращается после выполнения последнего оператора тела функции, а возвращаемое значение не определено. Оператор return имеет два варианта использования. Во-первых, этот оператор вызывает немедленный выход из текущей функции и возврат в вызывающую программу. Во вторых, этот оператор может использоваться для возврата значения функции. В теле функции может быть несколько операторов return, но может быть ни одного. В этом случае возврат в вызывающую программу происходит после выполнения последнего оператора в теле функции.В случае, когда оператор return отсутствует в теле функции, или за ним нет значения, то возвращаемое значение не определено. Если функция должна возвращать значение в соответствии со своим описанием, но не делает этого, компилятор выдаст предупреждение. Все функции, возвращающие значения, могут использоваться в выражениях языка С, но они не могут использоваться в левой части оператора присваивания, за исключением тех случаев, когда возвращаемым значением является указатель.49. Функции. Области видимости. Локальные и глобальные переменные.Локальные переменные – это переменные, объявленные внутри блока, в частности внутри функции. Язык С поддерживает простое правило: переменная может быть объявлена внутри любого блока программы. Локальная переменная доступна внутри блока, в котором она объявлена. Вспомним, что блок открывается фигурной скобкой и закрывается фигурной скобкой. Область действия локальной переменной – блок.Локальная переменная существует пока выполняется блок, в котором эта переменная объявлена. При выходе из блока эта переменная (и ее значение) теряется.Глобальные переменные – это переменные, объявленные вне какой либо функции. В отличие от локальных переменных глобальные переменные могут быть использованы в любом месте программы, но перед их первым использованием они должны быть объявлены. Область действия глобальной переменной – вся программа.Использование глобальных переменных имеет свои недостатки:– они занимают память в течение всего времени работы программы;– использование глобальных переменных делает функции менее общими и затрудняет их использование в других программах;– использование внешних переменных делает возможным появление ошибок из-за побочных явлений. Эти ошибки, как правило, трудно отыскать. 50. Указатели: определение, объявление.Понимание и правильное использование указателей является основой для создания профессиональных программ на языке С.Указатель – это переменная, которая предназначена для хранения и использования в программе адреса некоторого объекта. Здесь имеется в виду адрес в памяти компьютера. Адрес представляет собой простое целое число, но его нельзя трактовать как переменную или константу целого типа. Если переменная по смыслу является указателем, то она должна быть соответствующим образом объявлена. Форма объявления указателя следующая: Тип *<имя переменной>;В этом объявлении тип – некоторый допустимый для языка С тип данных, на который указывает указатель. Знак * – означает, что следующая за ним переменная является указателем. Например: char *ch; int *temp, i, *j; float *pf, f;Здесь объявлены указатели ch,temp,j,pf, переменная i типа int и переменная f типа float.С указателями связаны две специальные операции & и *. Обе эти операции являются унарными, т. е. имеют один операнд, перед которым они ставятся. Операция & соответствует по смыслу операции взятия (определения) адреса. Операция * является по смыслу операцией взятия (определения) значения по указанному адресу. Данные операции нельзя спутать с соответствующими им по написанию бинарными операциям – поразрядным AND и операцией умножения, так как они являются унарными, что всегда видно из контекста программы.При объявлении указателя очень важным является базовый тип, который сообщает компилятору сколько байт памяти занимает переменная, на которую указывает данный указатель.51. Указатели: Адресная арифметика (Арифметические операции над адресами) Над адресами в языке Си определены следующие операции: ● суммирование, можно добавлять к указателю целое значение; ● вычитание, можно вычитать указатели или вычитать из указателя целое число. Однако при выполнении арифметических операций есть некоторые особенности. Рассмотрим их на следующем примере. double *p1; float *p2; int *i; p1++ p2++; i++; } Операция p1++ увеличивает значение адреса на 8, операция p2++ увеличивает значение адреса на 4, а операция i++ на 2. Операции адресной арифметики выполняются следующим образом: ● операция увеличения приводит к тому, что указатель будет слаться на следующий объект базового типа (для p1 _ э то double,д ля p2 _ floatд, ля i _ int); ● операция уменьшения приводит к тому, что указатель, ссылается на предыдущий объект базового типа. ● после операции p1=p1+n, указатель будет передвинут на n объектов базового типа; p1+n как бы адресует n-й элемент массива, если p1 _ а дрес н ачала м ассива .
|