Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lek9-10.doc
Скачиваний:
5
Добавлен:
15.11.2018
Размер:
217.6 Кб
Скачать

Void main()

{

// Определяются размеры массива

Int n; // Порядок матрицы

cout << "\nVveditre poriadok matrizi: ";

cin >> n;

// Указатель для массива указателей

float **matr;

matr = new float *[n]; // Массив указателей float *

if (matr == 0)

{

cout << "He создан динамический массив!";

return; // Завершение программы

}

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

{

// Строка-массив значений типа float:

matr[i] = new float[n];

if (matr[i] == 0)

{

cout << "He создан динамический массив!";

return; // Завершение программы

}

for (int j = 0; j < n; j++) // Заполнение матрицы

// Формирование нулевых элементов:

if (i != j)

matr[i][j] = 0;

else

// Формирование единичной диагонали:

matr[i][j] = 1;

}

for (i = 0; i < n; i++) // Цикл перебора строк

{

cout << "\n Stroka " << (i + 1) << ":";

// Цикл печати элементов строки:

for (int j = 0; j < n; j++)

cout << "\t" << matr[i][j];

}

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

delete matr[i];

delete[]matr;

getchar();

getchar();

}

/*

Vveditre poriadok matrizi: 5

Stroka 1: 1 0 0 0 0

Stroka 2: 0 1 0 0 0

Stroka 3: 0 0 1 0 0

Stroka 4: 0 0 0 1 0

Stroka 5: 0 0 0 0 1

*/

Указатели и функции

Ссылки и указатели как параметры функции

При вызове функции информация о переменной может передаваться функции в двух видах. Если мы используем форму обращения

function1(x);

происходит передача значения переменной x. Если же мы используем форму обращения

function2(&x);

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

function1(int num)

Вторая форма обращения требует, чтобы определение функции включало в себя формальный аргумент, являющийся указателем на объект соответствующего типа:

function2(int *ptr)

Наиболее употребительно в Си, а в других языках - единствен­но возможное использование ссылки как формального параметра функции. Это означает, что при вызове функции формальный па­раметр создается как переменная-ссылка, то есть отображается на соответствующий фактический параметр. Различия двух спосо­бов передачи:

- при передаче по значению формальный параметр является копией фактического и может быть изменен независимо от значе­ния оригинала - фактического параметра. Это входной параметр;

- при передаче по ссылке формальный параметр отображается на фактический, и его изменение сопровождается изменением фак­тического параметра-прототипа. Такой параметр может быть как входным, так и выходным.

Формальный параметр-ссылка совпадает с формальным пара­метром-значением по форме (синтаксису использования), а с ука­зателем - по содержанию (механизму реализации).

//

// Формальный параметр - значение

void inc(int vv){ vv++; }

// Передается значение - копия nn

void main(){ int nn=5; inc(nn); } // nn=5

//

// Формальный параметр - указатель

void inc(int *pv) { (*pv)++; }

// Передается указатель - адрес nn

void main(){ int nn=5; inc(&nn); } // nn=6

//

// Формальный параметр - ссылка void inc (int &vv) { vv++; }

// Передается указатель - синоним nn

void main(){ int nn=5; inc(nn); } // nn=6

Указатель - результат функции.

Функция в качестве резуль­тата может возвращать указатель. Формальная схема функции обя­зательно включает в себя:

  • определение типа результата в заголовке функции как указа­теля. Это обеспечивается добавлением пресловутой "*" перед именем функции - int *F(...;

  • оператор return возвращает объект (переменную или выра­жение), являющийся по своей природе (типу данных) указателем. Для этого можно использовать локальную переменную - указатель.

Содержательная сторона проблемы состоит в том, что функция либо выбирает один из известных ей объектов (переменных), либо создает их в процессе своего выполнения (динамические пере­менные), возвращая в том и другом случае указатель на него. Для выбора у нее не так уж много возможностей. Это могут быть:

  • глобальные переменные программы;

  • формальные параметры, если они являются массивами, ука­зателями или ссылками, то есть «за ними стоят» другие переменные.

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

Пример: функция возвращает указатель на минимальный эле­мент массива. Массив передается как формальный параметр.

// Результат функции - указатель на минимальный элемент

int *min(int A[], int n){

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