Лекции по проге / 10_2_Указатели_Применение
.pdf
Использование передачи параметров по адресу
● Поскольку имя массива является указателем, то массивы автоматически передаются в функции по адресу. В формальных параметрах функции их нередко описывают как указатели
●По адресу могут передаваться большие структуры, чтобы избежать их долгого копирования при передаче по значению
●Если переданный по адресу массив или структура
|
не должны изменяться в функции, то их следует |
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
