Студопедия
Главная страница | Контакты | Случайная страница

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатика
ИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханика
ОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторика
СоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансы
ХимияЧерчениеЭкологияЭкономикаЭлектроника

Массивы переменных размеров. Функции использования динамической памяти.

Читайте также:
  1. Callback-функции;
  2. I. Понятие, структура и функции религии. Социологические теории религии.
  3. N3 Функции философии
  4. VIII. Приемы использования фразеологизмов в публицистике и художественной литературе
  5. А) Ссылочные переменные б) Параллельные массивы
  6. АВТОМОБИЛЬНЫЙ ТРАНСПОРТ, ЕГО РОЛЬ И ТЕХНИКО-ЭКОНОМИЧЕСКИЕ ОСОБЕННОСТИ, СФЕРЫ ИСПОЛЬЗОВАНИЯ
  7. Адаптационные изменения сердечно-сосудистой системы при физических нагрузках. Средства ЛФК, восстанавливающие нарушения функции сердца.
  8. Ампутация и экзаргикуляция. Виды ампутаций в зависимости от использования различных тканей для формирования культи. Особенности ампутаций конечностей в детском возрасте.
  9. Анализ использования межбанковских кредитов
  10. Анализ использования основных производственных фондов.

Динамический массив – это массив с переменным размером, т.е. количество элементов может изменяться во время выполнения программы. Динамические массивы дают возможность более гибкой работы с данными, так как позволяют не прогнозировать хранимые объемы данных, а регулировать размер массива в соответствии с реально необходимыми объемами.

Пример: float *array1;

array1=(float*)malloc(10*sizeof(float)) // выделение 10 блоков по sizeof(float) байт каждый.

Динамическое распределение означает, что программа выделяет память для данных во время своего выполнения. Память для глобальных переменных выделяется во время компиляции, а для нестатических локальных переменных - в стеке. Во время выполнения программы ни глобальным, ни локальным переменным не может быть выделена дополнительная память.

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

Основу системы динамического распределения в С составляют функции malloc() и free(). Эти функции работают совместно. Функция malloc() выделяет память, а free() – освобождает ее. Это значит, что при каждом запросе функция malloc() выделяет требуемый участок свободной памяти, а free() освобождает его, то есть возвращает системе. В программу, использующую эти функции, должен быть включен заголовочный файл <stdlib.ru>.

Прототип функции malloc() следующий:

void *malloc(size_t количество_байтов);

Здесь количество байтов – размер памяти, необходимой для размещения данных. При успешном выполнении malloc() возвращает указатель на первый байт непрерывного участка памяти, выделенного в динамически распределяемой области памяти. Если в динамически распределяемой области памяти недостаточно свободной памяти для выполнения запроса, то память не выделяется и malloc() возвращает нуль.

 

42. Определение функций. Программирование с использованием функций. Возвращение значения: оператор return.

Функция – это самостоятельная единица программы, созданная для решения конкретной задачи. Как и переменные функции надо объявлять. Функцию необходимо объявить до ее использования.

Каждая функция языка С имеет имя и список аргументов (формальных параметров).

Функции могут возвращать значение. Это значение может быть использовано далее в программе. Так как функция может вернуть какое-нибудь значение, то обязательно нужно указать тип данных возвращаемого значения. Если тип не указан, то по умолчанию предполагается, что функция возвращает целое значение (типа int). После имени функции принято ставить круглые скобки. В этих скобках перечисляются параметры функции, если они есть. Если у функции нет параметров, то при объявлении и при описании функции вместо <список параметров> надо поставить void – пусто.

Основная форма описания функции имеет вид:

тип <имя функции> (список параметров)

{

тело функции

}

Объявление (прототип) функции имеет вид:

тип <имя функции> (список параметров);

Вызов функции делается следующим образом:

<имя функции> (параметры);

или

<переменная>=<имя функции>(параметры);

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

Пример вызова функции, которая будет печатать строку «вызвали функцию» на экран.

#include<stdio.h>

void main(void) //точка входа в программу

{

void function1(void) //объявление функции

function1(); //вызов функции

}

/*Описание функции*/

void function1(void) // заголовок функции

{ // Начало тела функции

printf(“Вызвали функцию\n”);

} //Конец тела функции

Результатом работы программы будет строка, напечатанная на экране.

В теле функции main() мы объявили функцию function1(), затем ее вызвали. В теле функции function1() мы вызываем функцию printf().

Тип возвращаемого значения у функции function1 void (пусто). Это значит, что функция не будет возвращать никакого значения.

Функции возвращающие значение.

Функции с параметрами.

Функции языка С могут иметь параметры. Эти параметры передаются в функцию и там обрабатываются. В списке параметров для каждого параметра должен быть указан тип.

Пример правильного списка параметров: function(int x, char a, float z). Пример неправильного списка параметров: function(int x, a, float z).

Формальные параметры – параметры, которые мы объявляем в заголовке функции при описании.

Фактические параметры – параметры, которые мы подставляем при вызове функции.

Оператор return.

Оператор return завершает выполнение функции, в которой он встретился, и передает управление в вызывающую программу, в точку вызова.

Оператор имеет следующий формат:

return [(выражение)];

Выражение обычно заключается в круглые скобки, хотя это не обязательно. Выражение может быть как некоторой константой, так и вычисляемым выражением любого допустимого типа.

Оператор return в теле функции может быть записан несколько раз. Значение выражения, вычисленное в операторе return, возвращается в вызывающую функцию в качестве результата выполнения функции. Если функция возвращает результат, то ее вызов можно использовать в качестве операнда в выражении:

t=func(a,b)+sum(mas,k);

Если в операторе return отсутствует выражение (т.е. записано return;), то вызывающей функции никакое значение явно не возвращается. При отсутствии оператора return управление в точку вызова будет передано после выполнения последнего оператора функции. В этом случае функция также явно не возвращает результат, перед именем такой функции в ее прототипе и определении должно быть записано слово void.

Если функция определена как возвращающая результат, а в операторе return выражение отсутствует, то выдается сообщение об ошибке.

 

43. Аргументы функции: формальные и фактические. Передача аргументов, стек.

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

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

Функция – это самостоятельная единица программы, созданная для решения конкретной задачи.

Формальные параметры – это параметры, которые мы объявляем в заголовке функции при описании.

Фактические параметры – это параметры, которые мы подставляем при вызове функции.

void myfunc(int x); // объявление функции

void main(viod)

{

int a=5;

myfunc(a); // а – фактический параметр

}

//Описание функции

void myfunc(int x) // x – формальный параметр

{

x=x+10;

printf(“Вывод х=%d”,x);

}

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

/* Возвращает 1, если символ c входит в строку s; и 0 в противном случае. */int is_in(char *s, char c){ while(*s) if(*s==c) return 1; else s++; return 0;}

Функция is_in() имеет два параметра s и с. Если символ с входит в строку s, то эта функция возвращает 1, в противном случае она возвращает 0.

Хотя параметры выполняют специальную задачу, - принимают значения аргументов, передаваемых функции, - они все равно ведут себя так, как и другие локальные переменные. Формальным параметрам функции, например, можно присваивать какие-либо значения или использовать эти параметры в каких-либо выражениях.

В языках программирования имеется два способа передачи значений подпрограмме. Первый из них – вызов по значению. При его применении в формальный параметр подпрограммы копируется значение аргумента. В таком случае изменения параметра на аргумент не влияют.

Вторым способом передачи аргумента подпрограмме является вызов по ссылке. При его применении в параметр копируется адрес аргумента. Это значит, что, в отличие от вызова по значению, изменения значения параметра приводят к точно таким же изменениям значения аргумента.

За небольшим количеством исключений, в языке С для передачи аргументов используется вызов по значению.

#include <stdio.h> int sqr(int x); int main(void){ int t=10; printf("%d %d", sqr(t), t); return 0;} int sqr(int x){ x = x*x; return(x);}

В этом примере в параметр х копируется 10 – значение аргумента для sqr(). Когда выполняется присваивание х=х*х, модифицируется только локальная переменная х. А значение переменной t, использованной в качестве аргумента при вызове sqr(), по-прежнему остается равным 10. Поэтому выведено будет следующее: 100 10.

Вызов по ссылке

Хотя в С для передачи параметров применяется вызов по значению, можно создать вызов и по ссылке, передавая не сам аргумент, а указатель на него. Указатель передается так, как и любой другой аргумент. Конечно, в таком случае параметр следует декларировать как один из типов указателей.

Стек представляет собой упорядоченный набор элементов, доступ к которым осуществляется только с одного конца, называемого вершиной стека.




Дата добавления: 2015-02-16; просмотров: 123 | Поможем написать вашу работу | Нарушение авторских прав




lektsii.net - Лекции.Нет - 2014-2025 год. (0.011 сек.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав