196.14K
Category: programmingprogramming

Указатели. Лекция 2

1.

Лекция 2

2.

Операторы
Оператор адреса (&)
#include <iostream>
int main()
{
int a = 7;
std::cout << a << '\n'; // выводим значение переменной a
std::cout << &a << '\n'; // выводим адрес памяти переменной a
return 0;
}
Результат:
7
0046FCF0
Оператор разыменования (*)
#include <iostream>
int main()
{
int a = 7;
std::cout << a << '\n'; // выводим значение переменной a
std::cout << &a << '\n'; // выводим адрес переменной a
std::cout << *&a << '\n'; /// выводим значение ячейки памяти переменной a
return 0;
}
Результат:
7
0046FCF0
7

3.

Указатели
Указатель — это переменная, значением которой является адрес (ячейка)
памяти. Указатели объявляются точно так же, как и обычные переменные,
только со звёздочкой между типом данных и идентификатором:

4.

Указатели
Результат:
003AFCD4
003AFCD4
Следующее не является допустимым:
int *ptr = 7;
double *dPtr = 0x0012FF7C;
Разыменование указателей
Результат:
0034FD90
5
0034FD90
5

5.

Указатели
Разыменование некорректных указателей
Размер указателей

6.

• В чём польза указателей?
• Сейчас вы можете подумать, что указатели являются непрактичными и
вообще ненужными. Зачем использовать указатель, если мы можем
использовать исходную переменную?
• Однако, оказывается, указатели полезны в следующих случаях:
Случай №1: Массивы реализованы с помощью указателей.
Указатели могут использоваться для итерации по массиву.
Случай №2: Они являются единственным способом динамического
выделения памяти в C++ . Это, безусловно, самый распространённый
вариант использования указателей.
Случай №3: Они могут использоваться для передачи большого
количества данных в функцию без копирования этих данных.
Случай №4: Они могут использоваться для передачи одной функции
в качестве параметра другой функции.
Случай №5: Они используются для достижения полиморфизма при
работе с наследованием .
Случай №6: Они могут использоваться для представления
одной структуры/класса в другой структуре/классе, формируя, таким
образом, целые цепочки.

7.

Указатели и массивы
Перебор массива
int a[5] = {1, 2, 3, 4, 5};
int *ptr = a;
int a2 = *(ptr+2);
std::cout << "value: " << a2 <<
std::endl; // value: 3
int a[5] = {1, 2, 3, 4, 5};
for(int *ptr=a; ptr<=&a[4]; ptr++)
{
std::cout << "address=" << ptr <<
"\tvalue=" << *ptr << std::endl;
}
#include <iostream>
int main()
{
int a[3][4] = { {1, 2, 3, 4} , {5, 6, 7, 8}, {9, 10, 11, 12}};
int n = sizeof(a)/sizeof(a[0]);
// число строк
int m = sizeof(a[0])/sizeof(a[0][0]);
// число столбцов
int *end = a[0] + n * m - 1;
// указатель на самый последний элемент 0 + 3 * 4 - 1 = 11
for(int *ptr=a[0], i=1; ptr <= end; ptr++, i++)
{
std::cout << *ptr << "\t";
// если остаток от целочисленного деления равен 0,
// переходим на новую строку
if(i%m == 0)
{
std::cout << std::endl;
}

8.

Указатели и массивы
#include <iostream>
int main()
{
int a[3][4] = { {1, 2, 3, 4} , {5, 6, 7, 8}, {9, 10, 11, 12}};
int n = sizeof(a)/sizeof(a[0]);
// число строк
int m = sizeof(a[0])/sizeof(a[0][0]);
// число столбцов
int *end = a[0] + n * m - 1;
// указатель на самый последний элемент 0 + 3 * 4 - 1 = 11
for(int *ptr=a[0], i=0; i<m*n;)
{
std::cout << *ptr++ << "\t";
// если остаток от целочисленного деления равен 0,
// переходим на новую строку
if(++i%m == 0)
{
std::cout << std::endl;
}
}
return 0;
}
Указатель на массив символов
#include <iostream>
int main()
{
char letters[] = "hello";
char *p = letters;
std::cout << p << std::endl;
return 0;
}
// hello
English     Русский Rules