- •1. Роль указателей в языке с.
- •3. Определение указателя.
- •4. Объявление указателей.
- •5. Операции получения адреса и значения.
- •6. Правила использования основных операций.
- •7. Указатель на переменную и константу.
- •8. Инициализация указателей.
- •1. Присваивание указателю адреса существующего объекта:
- •9. Работа с указателями.
- •Int *pI;
- •Int I, *pI;
- •Int *pI;
- •Int I, *pI;
- •10. Задание, инициализация, вывод переменных и их указателей.
- •11. Ограничения на использование основных
- •12. Указатель константа.
- •13. Константы и ссылки/указатели
- •5 4 2 1 3 // Порядок интерпретации описания
- •16. Многоуровневая адресация
- •17. Операции над указателями.
- •18. Пустой указатель (null-указатель).
- •19. Ввод адреса с клавиатуры.
- •20. Разность значений указателей.
- •14. Присваивание указателей различного типа.
- •22. Явное преобразование типа указателя
- •23. Роль операции sizeof в управлении памятью
- •25. Работа с областью памяти переменного формата
7. Указатель на переменную и константу.
Указатель может быть константой или переменной, а также указывать на константу или переменную.
Рассмотрим примеры:
int i; // целая переменная
const int ci = 1; // целая константа
int * p i ; // указатель на целую переменную
const int * pci; // указатель на целую константу
int * const ср = &i; // указатель-константа на целую
переменную
const int * const срс = &ci; // указатель-константа на целую
константу
Как видно из примеров, модификатор const, находящийся между именем указателя и звездочкой, относится к самому указателю и запрещает его изменение, а const слева от звездочки задает посто-янство значения, на которое он указывает.
Для инициализации указателей использована операция получения адреса &.
Величины типа указатель подчиняются общим правилам определения области действия, видимости и времени жизни.При определении указателя надо стремиться выполнить его инициализаци
8. Инициализация указателей.
При определении указателя надо стремиться выполнить его инициализацию, то есть присвоение начального значения. Непреднамеренное использование неинициализированных указателей — распространенный источник ошибок в программах. Инициализатор записыва-ется после имени указателя либо в круг-лых скобках, либо после знака равенства.
Существуют следующие способы инициализации указателя:
1. Присваивание указателю адреса существующего объекта:
• с помощью операции получения адреса:
int а = 5; // целая переменная
int* р = &а; //в указатель записывается адрес а
int* р (&а): // то же самое другим способом
• с помощью значения другого инициализированного указателя:
int* r = р;
• с помощью имени массива или функции, которые трактуются как адрес:
int b[10]; // массив
i n t * t = b; // присваивание адреса начала массива
void f ( int а ){ /* ... * / } // определение функции
void ( * pf ) ( int ); // указатель на функцию
pf = f; // присваивание адреса функции
2. Присваивание указателю адреса области памяти в явном виде:
char* vp = (char *)0хВ8000000:
Здесь ОхВ8000000 — шестнадцатеричная константа, (char *) — операция приведения типа: константа преобразуется к типу «указатель на char».
3. Присваивание пустого значения:
int* SUXX = NULL;
1nt* rulez = 0:
В первой строке используется константа NULL, определенная в некоторых заголовочных файлах С как указатель, равный нулю. Рекомендуется использовать просто О, так как это значение типа int будет правильно преобразовано стандартными способами в соответствии с контекстом. Поскольку гарантируется,что объектов с нулевым адресом нет, пустой указатель можно использовать для проверки, ссылается указатель на конкретный объект или нет.
Никогда не следует использовать неинициализированные указатели, потому что это приводит к ошибкам, которые весьма трудно подда-ются отладке.Инициализация указателей более актуальна, чем пере-менных, так как поведение программы, имеющей неопределённые указатели, непредсказуемо и часто вызывает зависание системы.