Билет 11.
11.1 Указатели. Использование динамической памяти (С/С++)
Указатели.
• указатель – это переменная, в которой записан адрес другой переменной;
• при объявлении указателя надо указать тип переменных, на которых он будет указывать, а перед именем поставить знак *;
• знак & перед именем переменной обозначает ее адрес;
• знак * перед указателем в рабочей части программы (не в объявлении) обозначает значение ячейки, на которую указывает указатель;
• нельзя записывать по указателю, который указывает непонятно куда – это вызывает сбой программы, поскольку что-то стирается в памяти;
• для обозначения недействительного указателя используется константа NULL; pC = NULL;
• при изменении значения указателя на n он в самом деле сдвигается к n-ому следующему числу данного типа, то есть для указателей на целые числа на n*sizeof(int) байт;
• указатель печатаются по формату %p.
Операция косвенной адресации *
Когда за знаком * следует указатель на переменную, результатом операции является величина, помещенная в ячейку с указанным адресом.
|
|
int i,k, *pin;
printf("i=");
scanf("%d",&i);
pin=&i;
k=*pin;
printf("k=%d\n",k);
getch();
system("cls");
Операция присвоения указателей.
• Указателю можно присвоить значение указателя того же типа или типа void. В последнем случае требуется использовать приведение к типу. Указателю на тип void может быть присвоен указатель любого типа. Тогда также требуется использовать приведение к типу.
int *ip,*pin, nurse;
void *pv;
double *pd;
pin=&nurse;
ip=pin;
pv=(void *) ip;
pd=(double*) pv;
/* В итоге, указатель на double ссылается на то же место, что и указатель на int. */
Массивы и указатели
Динамическое выделение памяти
Для запроса памяти, чтобы размещать переменные в языке Си можно использовать две стандартные функции malloc() и calloc().
Аргументом функции malloc() является количество запрашиваемой памяти в байтах. Функция возвращает значение адреса начала выделенной области памяти, если выделение памяти произошло успешно, и NULL – если произошла ошибка.
Аргументами функции calloc() являются две целые неотрицательные величины: размер блока памяти в байтах size и количество запрашиваемых блоков памяти n. Функция возвращает значение адреса начала выделенной области памяти, если выделение памяти произошло успешно, и NULL – если произошла ошибка. Для освобождения запрошенной памяти используется функция free().
Пример
Работа с графиками MatLab (2D)
Смотри билет №10
Билет №12