Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лекции по проге / 10_2_Указатели_Применение

.pdf
Скачиваний:
30
Добавлен:
14.03.2016
Размер:
143.05 Кб
Скачать

Использование передачи параметров по адресу

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

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

Если переданный по адресу массив или структура

 

не должны изменяться в функции, то их следует

11

передавать указателями на постоянное значение

 

Типовые ошибки при работе с указателями

Если переменная локальная, то после завершения

еесуществования пользоваться ее адресом нельзя

//Создает копию исходного массива

int * copyMass(const int mass[], int N)

{

const int maxN = 100;

//

макс.

размер массива

int copy[maxN];

//

копия

массива

for(int i = 0; i < N; i++) { copy[i] = mass[i]; }

return copy;

12 }

Типовые ошибки при работе с указателями

// Обращается к копии массива void main(void)

{

const int N = 7;

int mass[N] = {3,4,3,5,6,7,6}; // исходный массив int * copy_mass; /* копия массива (указатель на

копию) */

copy_mass = copyMass(mass, N);

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

{ printf("%d ", copy_mass[i]); } /* обращение к "несуществующей" памяти */

13 }

Задание

Исключить в программе обращение к локальной переменной

14

Исключение обращения к локальной переменной

Решение — передать массив-копию как параметр функции copyMass()

// Создает копию исходного массива

void copyMass(const int mass[], int N, int copy[])

{

for(int i = 0; i < N; i++) { copy[i] = mass[i]; }

15 }

Исключение обращения к локальной переменной

// Обращается к копии массива void main(void)

{

const int N

= 7;

 

 

int

mass[N]

= {3,4,3,5,6,7,6}; //

исходный массив

int

copy_mass[N];

//

копия массива

copyMass(mass, N, copy_mass);

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

{ printf("%d ", copy_mass[i]);

16 }

Это надо помнить!

Память компьютера можно рассматривать как одномерный массив, а адрес ячейки памяти — как индекс в нем

Имя массива является константным указателем на его первый элемент

Следующие операции эквивалентны

a[i] *(a+i)

17

Это надо помнить!

Если в функцию передать указатель на переменную, то функция сможет ее изменить

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

18

Ошибки при компиляции для VS 2008 Russian

нет преобразования '<тип>' в '<тип> *' - вы пытаетесь использовать указатель вместо значения по адресу (вероятно пропущена операция *, либо лишняя операция &)

нет преобразования '<тип> *' в '<тип>' - вы пытаетесь использовать значение там, где необходимо использовать указатель на него (вероятно пропущена операция *, либо лишняя операция &)

19

Ошибки при компиляции для VS 2005 English

cannot convert from '<тип>' to '<тип> *' - вы пытаетесь использовать указатель вместо значения по адресу (вероятно пропущена операция *, либо лишняя операция &)

cannot convert from '<тип> *' to '<тип>' - вы пытаетесь использовать значение там, где необходимо использовать указатель на него (вероятно пропущена операция *, либо лишняя операция &)

20