Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Назначение функций С, форма описания функций, прототип функции, вызов функции. Передача параметров в функцию.




Функция - это поименованная часть программы, которая может вызываться из других частей программы столько раз, сколько необходимо. Приведем программу, выдающую степени числа два (рисунок). Первая строка является описанием функции (прототипом). Она задает pow как функцию с параметрами типа float и int, возвращающую значение типа float. Описание функции необходимо для ее вызова, ее определение находится в другом месте.

Вызывается функция по ее имени, при этом в качестве параметров указываются необходимые переменные или константы: pow(1.2, i). При вызове функции тип каждого фактического параметра сверяется с типом, указанным в описании функции, точно так же, как если бы инициализировалась переменная описанного типа. Это гарантирует надлежащую проверку и преобразования типов. Например, вызов функции pow(12.3,"abcd") транслятор сочтет ошибочным, поскольку "abcd" является строкой, а не параметром типа int. В вызове pow(2,i) транслятор преобразует целую константу (целое 2) в число с плавающей точкой (float), как того требует функция. Функция pow может быть определена следующим образом (рисунок).

Первая часть определения функции задает ее имя, тип возвращаемого значения (если оно есть), а также типы и имена формальных параметров (если они существуют). Значение возвращается из функции с помощью оператора return. Разные функции обычно имеют разные имена, но функциям, выполняющим сходные операции над объектами разных типов, лучше дать одно имя. Если типы параметров таких функций различны, то транслятор всегда может разобраться, какую функцию нужно вызывать. Например, можно иметь две функции возведения в степень: одну - для целых чисел, а другую - для чисел с плавающей точкой (рисунок).

Такое многократное использование имени называется перегрузкой имени функции или просто перегрузкой.

Параметры функции могут передаваться либо "по значению", либо "по ссылке". Рассмотрим определение функции, которая осуществляет взаимообмен значений двух целых переменных. Если используется стандартный способ передачи параметров по значению, то придется передавать указатели (рисунок)

Унарная операция * называется косвенностью (или операцией разыменования), она выбирает значение объекта, на который настроен указатель.

Если использовать передачу параметра по ссылке, можно обойтись без явных операций с указателем (рисунок). Для любого типа T запись T& означает "ссылка на T". Ссылка служит синонимом той переменной, которой она инициализировалась. Отметим, что перегрузка допускает сосуществование двух функций swap в одной программе.

Динамическая память. Определение, назначение. Функции распределения памяти: malloc, calloc, free либо new и delete.

Malloc

#include<stdlib.h>

#include<alloc.h>

void *malloc(size_t size);

Функция обеспечивают выделение блока памяти, размером size байт. Функция возвращает указатель на первый байт выделенной памяти или нулевой указатель NULL, если для размещения блока недостаточно памяти. Содержимое блока остается неизменным. Если size=0, то функция возвращает NULL.

char *realloc(char *ptr, unsigned size);

Функция realloc изменяет размер ранее захваченного блока памяти. Аргумент ptr указывает на начало блока. Аргумент size задает новый размер блока в байтах. Содержимое блока не изменяется. Функция realloc возвращает char-указатель на перезахваченный блок памяти или значение NULL, если памяти недостаточно, чтобы расширить блок к заданному размеру. Блок может быть передвинут, если его размеры изменены, поэтому аргумент ptr для функции realloc не обязательно такой же, как и возвращаемое значение. При возврате NULL первоначальный блок освобождается. В памяти, на которую указывает возвращаемое значение, гарантировано выравнивание для хранения любого типа объекта. Чтобы получить указатель на тип, отличный от char, используется преобразователь типа возвращаемого значения.

void * calloc(size_t nitems, size_t size);

Функция calloc() выделяет память, размер которой равен значению выражения nitems * size, т.е. память, достаточную для размещения массива, содержащего nitems объектов размером size. Блок обнуляется. Если вы хотите выделить блок, размер которого превышает 64К то нужно использовать функцию farcalloc. calloc возвращает указатель на первый байт выделенной памяти или NULL, если недостаточно памяти для выделения нового блока или nitems или size равны 0.

void free(void *ptr);

Функция free() возвращает в динамически распределяемую область памяти блок памяти, адресуемый указателем рtr, после чего эта память становится доступной для выделения в будущем. Указатель ptr должен указывать на первый байт выделенной ранее динамической памяти с помощью функций malloc, calloc или realloc. Использование недопустимого указателя при вызове может вызвать крах системы. При передаче нулевого указателя функция free() не выполняет никакого действия.

Оператор new выделяет динамическую память и возвращает указатель соответствующего типа на эту область памяти: Data *p_var = new Data;

Здесь p_var — это переменная указателя, которая будет принимать адрес выделенной памяти, а Data представляет собой тип данных, которые будут храниться в этой памяти. Если запрос на выделение памяти не удовлетворяется, возникает исключение bad_alloc.

Инициализировать выделенную память можно, задав инициализатор ми использовав при этом следующую форму записи: Data *p_var = new Data (init);

init — это значение, которое будет присвоено выделенной памяти.

Чтобы выделить память для одномерного массива используйте следующую общую форму.

Data *p_var = new Data [size];

size указывает длину массива. При выделении массивов инициализация производиться.

Оператор delete освобождает память, на которую указывает аргумент. Эта память предварительно должна быть выделена с помощью оператора new: delete p_var;

Чтобы освободить массив, который был выделен с помощью оператора new, можно использовать следующую форму записи: delete [] p_var

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...