Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


Часть Становимся программистами




Теперь используем вместо дома переменную типа 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; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.01 с.)
Главная | Случайная страница | Обратная связь