Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология Образование Политология Производство Психология Стандартизация Технологии |
Часть Становимся программистами
Теперь используем вместо дома переменную типа int : int int* intAddress; intAddress = 10; Аналогично предыдущей записи, это поясняется так: — переменная типа int . Следует сохранить адрес raylnt в указателе intAddress и записать в пере- менную, которая находится по адресу, указанному в intAddress . Использование разных типов указателей Каждое выражение, как и переменная, имеет свой тип и значение. Тип выражения sintVar — указатель на переменную типа int , т.е. это выражение имеет тип int* . При сравнении его с объявлением указателя pintVar становится очевидно, что они одинаковы: int * pintVar = SintVar; // обе части этого присвоения // имеют тип *in t Аналогично pintVar имеет тип int*, a *pintVar — тип int: =1 0 // обе части этого присвоения // имеют тип int Тип переменной, на которую указывает pintVar, — int . Это эквивалентно тому, что если является адресом дома, то, как ни странно, указывает дом. Указатели на переменные других типов объявляются точно так же: double double* odoubleVar = *pdoubleVar =10.0 В компьютере класса Pentium размер указателя равен четырем байтам, независимо от того, на переменную какого типа он указывает14. Очень важно следить за соответствием типов указателей. Представьте, что может произойти, если компилятор в точности выполнит такой набор команд: int int* pintVar; pintVar = &nl; *pintVar = 100.0; Последняя строка требует, чтобы адресу, выделенному под переменную разме- ром в четыре байта, было записано значение, имеющее размер восемь байтов. На са- мом деле ничего страшного не произойдет, поскольку в этом случае компилятор при- ведет 100.0 к типу in t перед тем, как выполнить присвоение. Привести переменную одного типа к другому явным образом можно так: int iVar; double dVar 10.0; iVar (int)dVar; Так же можно привести и указатель одного типа к другому: int* piVar; double dVar = 10.0; double* piVar (int*)pdVar;
14 Вообще говоря, размер указателя зависит не только от типа процессора, но и от операционной системы, используемого компилятора и так называемой модели памяти создаваемой программы. — Прим. ред. Глава 8. Первое знакомство с указателями в C++ 91 Трудно предсказать, что может случиться, если сохранить переменные одного типа по адресам, выделенным под переменные другого типа. Сохранение переменных, имеющих большую длину, вероятно, приведет к уничтожению располо- женных рядом. Такая ситуация наглядно продемонстрирована с помощью программы
// демонстрирует результат // неаккуратного обращения с указателями <stdio.h>
int pszArgs[])
rnt rnt int upper = 0; n = 0; lower = 0; // выводим значения объявленных переменных << "upper = " << " \n" ; cout << "n = " « n « "\n"; cout << = " << "\n";
// сохраняем значение типа // в памяти, выделенной для int cout << double в int\n"; double* pD = ) *pD = // показываем результаты cout << = " << "\n"; cout << "n = " «' n << "\n"; cout << "lower " << lower « "\n"; первых трех строках функции происходит объявление трех переменных типа Допустим, что в памяти эти переменные находятся друг за другом. Следующие три строки выводят значения этих переменных на экран. Не удиви- тельно, что все три оказываются равными нулю. После этого происходит присвоение = 13.0; , в результате которого число, имеющее тип double, записывается в пе- ременную г., имеющую тип int . Затем все три переменные снова выводятся на экран. После записи действительного числа в целочисленную переменную п переменная upper оказалась "забитой" мусором. На языке домов и адресов эта программа будет выглядеть так: house* houseAddress = Main Street"; * = = Указатель houseAddress инициализирован как указатель на мой дом. Переменная hotelAddress содержит адрес отеля. После этого вместо адреса моего дома записыва- ется адрес отеля. Затем отель устанавливается по адресу моего дома. Однако, поскольку "Ритц" куда больше моего дома, не удивительно, что он уничтожит не только мой дом, но и дома моих соседей (хоть что-то приятное в результате ошибки!). Типизация указателей предохраняет программиста от неприятностей, связанных с сохранением данных большего размера в меньшем объеме памяти. Присвоение
|
Последнее изменение этой страницы: 2019-04-19; Просмотров: 219; Нарушение авторского права страницы