Programmirovanie_-_1_kurs / Лекции (опорный конспект)
.pdf7.3.Разыменование указателей
•Операция разыменования (*) позволяет обратиться к значению, записанному в области памяти, на которую ссылается указатель
1)
4) int |
a = |
1; |
double |
b = |
7.6; |
void* |
ptr; |
2)
3)
ptr = &a;
cout << *( (int*)ptr ) << "\n";
ptr = &b;
*( (double*)ptr ) /= 5; cout << b << "\n";
•Специальное значение NULL говорит о том, что указатель никуда не ссылается
5)
71
7.4. Операции над указателями (1)
Операция |
Выражение |
|
Результат |
Описание |
||
|
|
|
|
|
|
|
Равно (==) |
|
указатель1 |
== |
true/false |
Сравнивает два указателя на равенство адресов |
|
|
|
указатель2 |
|
|
|
|
|
|
|
|
|
||
Не равно (!=) |
указатель1 |
!= |
true/false |
Сравнивает два указателя на неравенство адресов |
||
|
|
указатель2 |
|
|
|
|
|
|
|
|
|
||
Меньше (<) |
указатель1 |
< |
true/false |
Возвращает истину, если адрес, на который ссылается |
||
|
|
указатель2 |
|
|
указатель1 меньше адреса, на который ссылается |
|
|
|
|
|
|
указатель2 |
|
|
|
|
|
|
|
|
Меньше |
или |
указатель1 |
<= |
true/false |
Возвращает истину, если адрес, на который ссылается |
|
равно (<=) |
|
указатель2 |
|
|
указатель1 меньше или равен адресу, на который |
|
|
|
|
|
|
ссылается указатель2 |
|
|
|
|
|
|
||
Больше (>) |
указатель1 |
> |
true/false |
Возвращает истину, если адрес, на который ссылается |
||
|
|
указатель2 |
|
|
указатель1 больше адреса, на который ссылается |
|
|
|
|
|
|
указатель2 |
|
|
|
|
|
|
|
|
Больше |
или |
указатель1 |
>= |
true/false |
Возвращает истину, если адрес, на который ссылается |
|
равно (>=) |
|
указатель2 |
|
|
указатель1 больше или равен адресу, на который |
|
|
|
|
|
|
ссылается указатель2 |
|
|
|
|
|
|
||
Вычитание (–) |
указатель1 |
– |
целое |
Вычисляет количество элементов заданного типа |
||
|
|
указатель2 |
|
число |
между указателями |
|
|
|
|
|
|
||
Вычитание (–) |
указатель |
– |
указатель |
Вычисляет указатель, отстоящий от заданного на |
||
|
|
целое_число |
|
|
определенное количество элементов (в соответствии с |
|
|
|
|
|
|
типом указателя) |
|
Сложение (+) |
указатель |
+ |
указатель |
|||
72 |
||||||
|
|
целое_число |
|
|
||
|
|
|
|
|
||
|
|
|
|
|
|
7.4. Операции над указателями (2)
1)
2)
3) int |
a |
= |
1; |
int |
b |
= |
1; |
int* ptr1 = &a; int* ptr2 = &b;
cout << ptr1 << "\n"; cout << ptr2 << "\n";
if (ptr1 < ptr2)
cout << "ptr1 < ptr2"; |
73 |
|
7.4. Операции над указателями (3)
4)
0012FEA8
0012FEB0
0012FEC0
5) int Y[10];
int* ptr1 |
= &(Y[2]); |
|
|
||||
int* ptr2 |
= &(Y[5]); |
|
|
||||
cout |
<< ptr1 << |
endl; |
|
|
|
0012FE90 |
|
|
|
|
0012FE9C |
||||
cout |
<< ptr2 << |
endl; |
|
|
|
3 |
|
|
|
int x = ptr2 - ptr1; cout << x;
74
7.5.Указатели и массивы
•Имя объявляемого массива всегда ассоциируется компилятором с адресом его самого первого элемента
1)
2)
3)
4) const int N=10; int A[N];
for (int i=0; i<N; i++)
{
int* ptr = A+i; *ptr = i*i;
}
for (int i=0; i<N; i++) cout << A[i] << " ";
75
7.6.Применение sizeof к указателям
7.7.Указатели на указатели
•К указателям можно применять оператор sizeof
1)
•Указатель может ссылаться на переменную, которая, в свою очередь, также является указателем
2)
76
7.8.Ссылки
•Ссылка – особая переменная, являющаяся скрытой формой указателя, который при использовании автоматически разыменовывается
•Ссылка, используется как псевдоним для другого объекта
77
7.9.Динамическое выделение памяти
7.9.1.Области памяти
•Области памяти:
–область кода
•машинный код программы
–область данных
•глобальные переменные
•строковые константы
–стек
•локальные
переменные
•параметры вызова функций
–куча
•динамические
переменные
•Динамические
переменные:
–Размещаются в области памяти «куча»
–Создаются с помощью специальных
функций/операторов
–Не имеют имени
–Доступ к переменным осуществляется по указателю
78
7.9.2.Функции malloc, calloc, free
•Функции malloc и calloc выделяют в памяти область заданного размера
•Функция free освобождает заданную область памяти
79
7.9.2.1 Пример динамического выделения памяти (1)
80