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

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

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

Лекция №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

a++;
(*b)++;
printf(" inc: a = %d, b = %d\n", a, *b);

Задание

Определить, что напечатает на экране следующая программа:

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