Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
konspect.doc
Скачиваний:
7
Добавлен:
23.09.2019
Размер:
151.55 Кб
Скачать

41. Передача аргументов в функцию

В правильно организованной функции использование списка аргументов (параметров) и возвращаемого значения является единственным способом связи этой функции с остальными.

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

42. Возврат значений из функций

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

Если же необходимо вернуть несколько значений, поступают одним из следующих образов:

1)"Запаковать" в структуру и вернуть как единое целое.

2)Передавать в списке аргументов не копии, а адреса пользовательских переменных (указатели).

3)В исключительных случаях прибегают к глобальным переменным.

43. Стандартные функции управления динамической памятью

Динамическая память выделяется и уничтожается блоками по требованию программиста. Делается это с помощью специальных функций описанных в заголовочном файле malloc.h

1. void* malloc(size_t size);// эта функция выделяет блок размера size байт. В случае успеха возвращает адрес начала выделенного блока, в случае неудачи NULL. 2. void* calloc(size_t n_items,size_t size);//size - размер одного элемента, n_items - кол-во элементов. 3.void free(void *block); //особождает память блока block. В качаестве аргумента функции free можно передовать один из адресов, выделенных ф-ми malloc и calloc. Повторно освобождать память запрещается (действие непредсказуемо). 4.void *realloc(void *block,size_t new_size);//перевыделяет память и гарантирует сохранность старых элементов в рамках new_size. 5.unsigned long coreleft(); //возвращает остаток динамической памяти правее самого старшего занятого участка (не общее кол-во)

44. Пример использования динамической памяти printf("Введите количество элементов массивов: "); scanf("%d",&n); double *p=NULL; p=(double *)Malloc(n*sizeof(double)); for(int i=0;i<n;i++) { p[i]=...;

}

free(p);

45. Пересчет индексов вручную.

Пользуясь тем, что строки двумерного массива располагаются в памяти друг за другом мы можем аналагично организовать работу с динамическим двумерным массивом, в этом случае требуется пересчет индексов i j в одномерный k. k=i*n+j, l=n*m Способ индексации одинаков как в вызывающей функции, так и в вызываемых.

void RandomMatr (double *Matr, int n, int m)

{

int i, j;

for(i = 0; i < n; i++)

for(j = 0; j < m; j++)

Matr[i*m+j] = random(MAXVAL) + 1;

}

void OutMatr( char *name, double *Matr, int n, int m )

{

int i, j;

printf("\nМатрица %s\n---------------\n", name);

for(i = 0; i < n; i++)

{

for(j = 0; j < m; j++)

printf("%8.1lf ", Matr[i*m+j]);

printf("\n");

}

}

46. Массивы с постоянной длиной строки. Если длина строки постоянна и известна на стадии компиляции, то можно описать указатель на массив постоянной длины строки и использовать обычную двойную индексацию, при этом память нужно выделить динамически а потом освободить.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]