- •Указатели
- •Указатели — это переменные, которые хранят адреса памяти.
- •Формат объявления переменной- указателя таков:
- •Чтобы объявить переменную р указателем на int-значение, используйте следующую инструкцию.
- •Базовый тип указателя определяет тип данных, на которые он будет
- •Операторы, используемые с указателями
- •Второй оператор работы с указателями (*) служит дополнением к первому (&). Это также
- •Операции, выполняемые с помощью указателей, часто называют операциями непрямого доступа, поскольку мы косвенно
- •Переменные-указатели должны всегда указывать на соответствующий тип данных. Например, при объявлении указателя типа
- •Несмотря на то что, как было заявлено выше, при присваивании два указателя должны
- •// Эта программа не будет выполняться
- •Результат работы программы:
- •При присваивании значения области памяти, адресуемой указателем, его (указатель) можно использовать с левой
- •Чтобы инкрементировать или декрементировать значение, расположенное в области памяти, адресуемой указателем, можно использовать
- •Арифметические операции над указателями
- •Пусть p1 — указатель на int- переменную с текущим значением 2 ООО (т.е.
- •Для операции декрементирования справедливо обратное утверждение, т.е. при каждом декрементировании значение p1 будет
- •Для указателей на символьные значения результат операций инкрементирования и декрементирования будет таким же,
- •Со значениями указателей можно выполнять операции сложения и вычитания, используя в качестве второго
- •Несмотря на то что складывать указатели нельзя, один указатель можно вычесть из другого
- •// Демонстрация арифметических операций
- •0012FE5C 0012FE84 0012FE60 0012FE8C 0012FE64 0012FE94 0012FE68 0012FE9C 0012FE6C 0012FEA4 0012FE70 0012FEAC 0012FE74
- •Узелок на память
- •Указатели и массивы
- •Имя массива без индекса образует
- •если нужно получить доступ к пятому элементу массива str, используйте одно из следующих
- •Арифметические операции над указателями выполняются быстрее, чем индексирование массивов, особенно при доступе к
- •int main()
- •int main()
- •Таблица строк — это таблица, сгенерированная компилятором
- •Значение одного указателя можно сравнивать с другим.
- •Даны два указателя (с именами А и В), которые ссылаются на один и
- •int main()
- •Массивы указателей
- •Чтобы присвоить значение переменной var целочисленной переменной х с помощью массива ipa, используйте
- •Объявленный, но не инициализированный указатель будет содержать произвольное значение.
- •Если указатель содержит нулевое значение, считается, что он ни на что не ссылается
- •Для тестирования указателя используется инструкция if (любой из следующих ее вариантов).
- •Можно создать указатель, который будет ссылаться на другой указатель, а тот — на
- •Переменную, которая является указателем на указатель, нужно объявить соответствующим образом. Для этого достаточно
- •// Использование многоуровневой
- •Неинициализированные указатели
- •Некорректное сравнение указателей
- •int first[10]; int second[10]; int *p, t;
- •Не забывайте об установке указателей
- •Узелок на память.
Переменные-указатели должны всегда указывать на соответствующий тип данных. Например, при объявлении указателя типа int компилятор "предполагает", что все значения, на которые ссылается этот указатель, имеют тип int.
int *р; double f;
// ...
р = &f; // ОШИБКА!
Несмотря на то что, как было заявлено выше, при присваивании два указателя должны быть совместимы по типу, это серьезное ограничение можно преодолеть с помощью операции приведения типов. Например, следующий фрагмент кода теперь формально корректен.
int *р; double f; // ...
р = (int *) &f; // Теперь все ОК!
// Эта программа не будет выполняться
правильно.
#include <iostream> using namespace std; int main()
{
double x, у; int *p;
x = 123.23;
p = (int *) &x; // Используем операцию приведения типов для присваивания double-
указателя int-указателю.
у = *p; // Что происходит при выполнении этой
инструкции?
cout << у; // Что выведет эта инструкция return 0;
}
Результат работы программы:
1.37439e+09
При присваивании значения области памяти, адресуемой указателем, его (указатель) можно использовать с левой стороны от оператора присваивания. Например, при выполнении следующей инструкции (если р — указатель на целочисленный тип)
*р = 101;
число 101 присваивается области памяти, адресуемой указателем р.
Таким образом, эту инструкцию можно
Чтобы инкрементировать или декрементировать значение, расположенное в области памяти, адресуемой указателем, можно использовать инструкцию, подобную следующей.
(*р)++;
#include <iostream> using namespace std; int main()
{
int *p, num;
p = #
*p = 100;
cout << num << ' ';
(*p)++;
cout << num << ' ';
(*p)--;
cout << num << '\n';
return 0;
}
Результаты программы: 100 101 100
Арифметические операции над указателями
С указателями можно использовать только четыре арифметических оператора:
++, --,
+,
-.
Пусть p1 — указатель на int- переменную с текущим значением 2 ООО (т.е. p1 содержит адрес 2
ООО).
После выполнения (в 32-разрядной среде) выражения
p1++;
содержимое переменной- указателя p1 станет равным 2 004, а не 2 001! Дело в том, что при каждом инкрементировании
Для операции декрементирования справедливо обратное утверждение, т.е. при каждом декрементировании значение p1 будет уменьшаться на 4. Например, после выполнения инструкции
p1--;
указатель p1 будет иметь значение 1 996, если до этого оно было равно 2 000.