Другие языки программирования и технологии

Два вопроса про указатели в С++ внутри.

1-ый вопрос При объявлении указателя задают (непонятно зачем) тип переменной. Но ведь после инициализации этих указателей в них будет хранится не значение соответствующего типа, а адрес той переменной на которую указывает указатель. Зачем-же тогда задают тип переменной? Именно это меня вводит в заблуждение. Проясните пож. мне этот вопрос. 2-ой вопрос Как понимать такой указатель? Если указатель объявлен дново встроенного или пользовательскова типа, а присвоить участок динамически распределяемой памяти другова встроенного или пользовательскова типа ? Например: short * pAge = new float; // ...Предположим где то выше объявлен класс x и класс y . x * pAge = new y; // ...x * pAge = new float; // ...short * pAge = new y; // ...Как при этом компилятор будет реагировать на первое (перед звёздочкой) название типа, и как на второе (после слова new) название типа ?
1-ый вопрос: Для арифметики
TYPE *p;
адрес p[n] = адрес p + n * sizeof(TYPE);
адрес p[n] будет разный для типов имеющих разный размер.

И если указатель на объест класса, то через него можно пользоваться свойствами и методами класса
class x
{
int GetSize();
};
class y
{
int GetAge();
};

x* px;
px->GetSize();

y* py;
py->GetAge();

классы разные, и указатели тоже разные.

2-ой вопрос

x* pAge = new x; // ...тип указателя
x* pAge = new x; // ...выделение динамической памяти размером sizeof(x), конструктор класса x, возвращает указатель на новую переменную.

Здесь во всех строчках компилятор обматерит, несоответствие типов.
x * pAge = new y; // ...
x * pAge = new float; // ...
short * pAge = new y; // ...
Сабиров Рустам
Сабиров Рустам
21 360
Лучший ответ
Типы указателей используются для операций с данными, на которые указывают указатели. Сначала в C вообще не было массивов, только адресная арифметика указателей. Фактически указатели были представителями данных (косвенная адресация данных) . Второе назначение типов указателей - проверка осмысленности операций с данными, к которым обращаются через указатели, предотвращающая случайные ошибки. Необычное использование типов данных требует явного изменения программистом типов указателей на них.
short * pAge = new float; // ..
x * pAge = new y; // ...
x * pAge = new float; // ...
short * pAge = new y; // ...
Вот так сделать нельзя. компилятор заругается.
Указывать тип указателя нужно для того, чтоб можно было к ним применять арифметические действия.
Приведения типа указателей при работе с наследуемыми классами, кажется нарушением логики, но это не так. Если мы указателю на базовый класс присваиваем адресс производного, то мы не можем полноценно обращаться с объектом производного класса через этот указатель. Наш указатель будет указывать на объект базового класса внутри объекта производного класса. И всё.Мы всё равно не имеем через этот указатель доступ к другим членам объекта производного класса.
Строгость для типов указателей нужна для предотвращения разрушения адрессной индексации.
LY
Love You
9 759
1. Но ведь компилятор должен знать, какого типа переменная хранится по этому адресу. Допустим если поместить по этому адресу longint а считать каким-нибудь образом char - то ты получишь только один байт из четырех, которые были сохранены.

2. Си - это инструмент, острый как бритва. им можно сделать и тонкую работу и кровавое месиво. кажется так у Кернигана было сказано. И ваш пример - лишнее тому подтверждение.
читать нехоца
Руслан Попов
Руслан Попов
1 214