Конспект лекций Часть II одесса, 2003
Download 0.65 Mb. Pdf ko'rish
|
atki188 c konspekt 2
Одесский колледж компьютерных технологий “СЕРВЕР”
6 int main(){ Worker stuff[100]; … /*формирование массива stuff*/ for (int i = 0; i < 100; i++) print_worker(stuff[i]); //вызов функции return 0; } void print_worker(Worker w){ //определение функции cout< Функции используют память из стека программы. Некоторая область стека отводится функции и остаётся связанной с ней до окончания её работы, по завершению которой отведенная ей память освобождается и может быть занята другой функцией. Все величины, описанные внутри функции, а также её параметры, являются локальными. Областью их действия является функция. При вызове функции, как и при входе в любой блок, в стеке выделяется память под ло- кальные автоматические переменные. При выходе из функции продолжается вызывающая функция. При выходе из функции соответствующий участок стека освобожда- ется, поэтому значения локальных переменных между вызовами одной и той же функции не сохраняются. Если этого требуется избежать, при объявлении локальных переменных используется модификатор static: #include void f(int a){ int m=0; cout<<"n m p\n"; while (a--){ static int n=0; int p=0; cout< } } int main(){ f(3); f(2); return 0; } Статическая переменная n размещается в сегменте данных и инициализиру- ется один раз при первом выполнении оператора, содержащего её определе- ние. Автоматическая переменная m инициализируется при каждом входе в функцию. Автоматическая переменная p инициализируется при каждом вхо- де в блок цикла. Программа выведет на экран: n m p Одесский колледж компьютерных технологий “СЕРВЕР” 7 0 0 0 1 1 0 2 2 0 n m p 3 0 0 4 1 0 При совместной работе функции должны обмениваться информаци- ей. Это можно осуществить с помощью глобальных переменных, через пара- метры и через возвращаемое функцией значение. Глобальные переменные видны во всех функциях, где не описаны локальные переменные с теми же именами, поэтому использовать их для пе- редачи данных между функциями очень легко. Тем не менее, это не рекомен- дуется, поскольку затрудняет отладку программы и препятствует помещению функций в библиотеки общего пользования. Нужно стремиться к тому, чтобы функции были максимально независимы, а их интерфейс полностью опреде- лялся прототипом функции. Параметры, перечисленные в заголовке описания функции, называ- ются формальными, а записанные в операторе вызова функции – фактиче- скими. При вызове функции в первую очередь вычисляются выражения, стоящие на месте фактических параметров; затем в стеке выделяется память под формальные параметры функции в соответствии с их типом, и каждому из них присваивается значение соответствующего фактического параметра. При этом проверяется соответствие типов и, при необходимости, выполня- ются их преобразования. При несоответствии типов выдаётся диагностиче- ское сообщение. Существует два способа передачи параметров в функцию: по значе- нию и по адресу. При передаче по значению в стек заносятся копии фактических пара- метров, и операторы функции работают с этими копиями. Доступа к исход- ным значениям параметров у функции нет, а, следовательно, нет и возможно- сти их изменить. При передаче по адресу в стек заносятся копии адресов параметров, а функция осуществляет доступ к ячейкам памяти по этим адресам и может изменить исходные значения параметров: #include void f(int i, int* j, int& k); int main(){ int i=1, j = 2, k = 3; cout << "i j k\n"; cout < |
Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling
ma'muriyatiga murojaat qiling