- •Указатели
- •Указатели — это переменные, которые хранят адреса памяти.
- •Формат объявления переменной- указателя таков:
- •Чтобы объявить переменную р указателем на 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 main() |
|
{ |
|
int num[10]; |
int *start, *end; |
start = num; |
end = &num[9]; |
while(start <= end)
{
cout << "Введите число: ";
cin >> *start;
start++;
}
start = num; /* Восстановление указателя */
while(start <= end)
{
cout << *start << ' ';
start++;
}
return 0;
}
Массивы указателей
Указатели, подобно данным других типов, могут храниться в массивах. Вот, например, как выглядит объявление 10- элементного массива указателей на int- значения.
int *ipa[10];
Здесь каждый элемент массива ipa содержит указатель на целочисленное значение.
Чтобы присвоить адрес int-переменной с именем var третьему элементу этого массива указателей, запишите
следующее.
Чтобы присвоить значение переменной var целочисленной переменной х с помощью массива ipa, используйте такой синтаксис.
x = *ipa[2];
адрес переменной var хранится в элементе ipa[2], применение оператора "*" к этой индексированной переменной позволит получить значение
char *fortunes[] = {
"Вскоре деньги потекут к Вам рекой.\n",
"Вашу жизнь озарит новая любовь.\n",
"Вы будете жить долго и счастливо.\n",
"Деньги, вложенные сейчас в дело, принесут доход.\n",
"Близкий друг будет искать Вашего
расположения.\n"
};
для вывода второго сообщения достаточно использовать инструкцию, подобную следующей.
#include <iostream>
#include <cstdlib> #include <conio.h> using namespace std; char *fortunes[] = {
"Вскоре деньги потекут к Вам рекой.\n",
"Вашу жизнь озарит новая любовь.\n",
"Вы будете жить долго и счастливо.\n",
"Деньги, вложенные сейчас в дело, принесут доход.\n",
"Близкий друг будет искать Вашего расположения.\n"
};
int main()
{
int chance;
cout <<"Чтобы узнать свою судьбу, нажмите любую клавишу: ";
// Рандомизируем генератор случайных чисел.
while(!kbhit()) rand();
cout << '\n';
chance = rand();
chance = chance % 5;
cout << fortunes[chance];
return 0;
}
Объявленный, но не инициализированный указатель будет содержать произвольное значение.
При попытке использовать указатель до присвоения ему конкретного значения можно разрушить не только собственную программу, но даже и операционную систему
Если указатель содержит нулевое значение, считается, что он ни на что не ссылается
При объявлении указатель любого типа можно инициализировать нулевым значением, например, как это делается в следующей инструкции,
float *р = 0; // р — теперь нулевой указатель.
Для тестирования указателя используется инструкция if (любой из следующих ее вариантов).
if(р) // Выполняем что-то, если р
— не нулевой указатель.
if(!p) // Выполняем что-то, если р
— нулевой указатель.