Лекции по проге / 10_2_Указатели_Применение
.pdf
Лекция №10.2 Указатели: применение
● Память и указатель
●Действия с указателями
●Связь между указателями и массивами
●Передача параметров функции по адресу
●Типовые ошибки при работе с указателями
1
Назначение указателя
●Организация ссылок между переменными
●Передача параметров в функцию по адресу
●Работа с динамической памятью
2
Связь между указателями и массивами
● Компилятор считает, что имя массива — это константный указатель на первый элемент массива
●Над именем массива можно выполнять все операции, что и над обычным константным типизированным указателем
●В свою очередь, к типизированному указателю может быть применена операция []
●Таким образом, следующие операции эквивалентны:
3 |
a[i] ≡ *(a+i) |
Различие между указателем и массивом
● При объявлении массива выделяется память под его элементы
●При объявлении указателя память под значение, на которое он ссылается, не выделяется
int mass[10] = {}; // mass имеет тип int * const
int *pInt;
pInt
0 1 2 3 4 5 6 7 8 9
0
0
0
0
0
0
0
0
0
0 
4 |
mass |
Задание
Объявить указатель pInt на целое число и массив arr из 10 целых чисел
Присвоить указателю pInt адрес начала массива arr
Используя указатель pInt и операцию [], записать в первый (по счету) элемент массива число 0
Используя указатель pInt и операцию *, записать во второй (по счету) элемент массива сумму пер-
вого элемента и числа 10
5
Обращение к массиву через указатель
int *pInt; int arr[10]; pInt = arr;
// pInt = &arr[0]; - можно, но не эффективно!!
pInt[0] = 0; // или *pInt = 0;
*(pInt + 1) = *pInt + 10;
//или pInt[1] = pInt[0] + 10;
//или *(arr + 1) = *arr + 10;
6
Передача параметров в функцию по адресу
● Если вместо значения параметра в функцию передается указатель на него, то говорят, что параметр передается по адресу
●Если параметр передан по адресу, то изменения значения по этому адресу будут отражаться в вызывающей программе
●Функция может изменить переменную, переданную как параметр, если ее передать по адресу (например, это использует функция scanf)
7
Задание
Определить, что напечатает на экране следующая программа:
01 void inc(int a, int *b)
02{
03
04
05
06}
07 void main(void)
08 {
09int a = 0, b = 0;
10inc(a, &b);
11printf("main: a = %d, b = %d\n", a, b);
8 12}
|
|
Передача параметров в функцию по |
|
||||||
|
|
адресу (трасса вычислений) |
|
||||||
|
|
Строка 07 |
|
Строка 09 |
|
|
Строка 01 |
|
|
|
|
|
|
|
|
|
inc() |
b |
|
|
|
|
|
|
|
|
a |
0 |
|
|
main() |
|
main() |
b |
|
0 |
main() |
b |
0 |
|
|
a |
|
0 |
a |
0 |
|||
|
|
Строка 11 |
|
|
Строки 03-04 |
|
|
||
|
|
|
|
inc() |
b |
|
|
|
|
|
main() |
|
|
a |
0 -> 1 |
|
|
||
|
b |
1 |
main() |
b |
|
0 -> 1 |
|
|
|
9 |
a |
0 |
a |
|
0 |
|
|
||
Передача параметров в функцию по адресу
● Поскольку переменная a передана по значению, то ее изменение в функции inc не окажет влияния на функцию main, а для переменной b, переданной по адресу — окажет
● Как результат получим
inc: a = 1 b = 1 10 main: a = 0 b = 1
