- •Указатели
- •Указатели — это переменные, которые хранят адреса памяти.
- •Формат объявления переменной- указателя таков:
- •Чтобы объявить переменную р указателем на 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;
- •Не забывайте об установке указателей
- •Узелок на память.
Можно создать указатель, который будет ссылаться на другой указатель, а тот — на конечное значение. Эту ситуацию называют
многоуровневой непрямой адресацией (multiple indirection) или использованием указателя на указатель.
Переменную, которая является указателем на указатель, нужно объявить соответствующим образом. Для этого достаточно перед ее именем поставить дополнительный символ "звездочка"(*). Например, следующее объявление сообщает компилятору о том, что balance — это указатель на указатель на значение типа int.
// Использование многоуровневой
непрямой адресации.
#include <iostream> using namespace std; int main()
{
int x, *p, **q;
x = 10;
p = &x;
q = &p;
cout << **q; // Выводим значение
переменной x.
return 0;
}
Неинициализированные указатели
// Эта программа некорректна.
int main()
{
int х, *р;
х = 10;
*р = х;
//На что указывает переменная р?
return 0;
}
Некорректное сравнение указателей
char s[80]; char у[80]; char *p1, *р2; p1 = s;
р2 = у;
if(p1 < р2) . . .
int first[10]; int second[10]; int *p, t;
p = first; for(t=0; t<20; ++t)
{
*p = t;
p++;
}
Не забывайте об установке указателей
// Эта программа некорректна. #include <iostream>
#include <cstdio> #include <cstring> using namespace std; int main()
{
char s [80];
char *p1;
p1 = s;
do {
cout << "Введите строку: ";
gets(p1); // Считываем строку.
// Выводим ASCII-значения каждого символа.
while(*p1) cout << (int) *p1++ << ' ';
cout << ' \n';
}while(strcmp (s, "конец"));
return 0;
}
#include <iostream> #include <cstdio> #include <cstring> using namespace std; int main()
{
char s[80];
char *p1;
do {
p1 = s; // Устанавливаем p1 при каждой итерации
цикла.
cout << "Введите строку: ";
gets(p1); // Считываем строку.
// Выводим ASCII-значения каждого символа.
while(*p1) cout << (int) *p1++ <<' ';
cout << '\n';
}while(strcmp(s, "конец"));
return 0;
}
Узелок на память.
Чтобы использование указателей
было безопасным, нужно в любой момент знать, на что они ссылаются.