Другие языки программирования и технологии
Два вопроса про указатели в С++ внутри.
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; // ...
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; // ...
Типы указателей используются для операций с данными, на которые указывают указатели. Сначала в C вообще не было массивов, только адресная арифметика указателей. Фактически указатели были представителями данных (косвенная адресация данных) . Второе назначение типов указателей - проверка осмысленности операций с данными, к которым обращаются через указатели, предотвращающая случайные ошибки. Необычное использование типов данных требует явного изменения программистом типов указателей на них.
short * pAge = new float; // ..
x * pAge = new y; // ...
x * pAge = new float; // ...
short * pAge = new y; // ...
Вот так сделать нельзя. компилятор заругается.
Указывать тип указателя нужно для того, чтоб можно было к ним применять арифметические действия.
Приведения типа указателей при работе с наследуемыми классами, кажется нарушением логики, но это не так. Если мы указателю на базовый класс присваиваем адресс производного, то мы не можем полноценно обращаться с объектом производного класса через этот указатель. Наш указатель будет указывать на объект базового класса внутри объекта производного класса. И всё.Мы всё равно не имеем через этот указатель доступ к другим членам объекта производного класса.
Строгость для типов указателей нужна для предотвращения разрушения адрессной индексации.
x * pAge = new y; // ...
x * pAge = new float; // ...
short * pAge = new y; // ...
Вот так сделать нельзя. компилятор заругается.
Указывать тип указателя нужно для того, чтоб можно было к ним применять арифметические действия.
Приведения типа указателей при работе с наследуемыми классами, кажется нарушением логики, но это не так. Если мы указателю на базовый класс присваиваем адресс производного, то мы не можем полноценно обращаться с объектом производного класса через этот указатель. Наш указатель будет указывать на объект базового класса внутри объекта производного класса. И всё.Мы всё равно не имеем через этот указатель доступ к другим членам объекта производного класса.
Строгость для типов указателей нужна для предотвращения разрушения адрессной индексации.
1. Но ведь компилятор должен знать, какого типа переменная хранится по этому адресу. Допустим если поместить по этому адресу longint а считать каким-нибудь образом char - то ты получишь только один байт из четырех, которые были сохранены.
2. Си - это инструмент, острый как бритва. им можно сделать и тонкую работу и кровавое месиво. кажется так у Кернигана было сказано. И ваш пример - лишнее тому подтверждение.
2. Си - это инструмент, острый как бритва. им можно сделать и тонкую работу и кровавое месиво. кажется так у Кернигана было сказано. И ваш пример - лишнее тому подтверждение.
читать нехоца
Похожие вопросы
- Вопрос про указатели в С++ внутри
- Вопрос по указателям и массива С++
- Вопрос по WEB Дизайну/программированию - внутри фото.
- Вопрос про константы в С++ внутри.
- Знатоки HTML, нужна помощь! Думаю, вопрос не сложный для вас. Внутри.
- Вопрос по обучению в программировании (внутри, важно)
- Вопрос по 3ds Max (Видео внутри)
- СЛОЖНА! С++ Начал читать про указатели. Скопилось куча вопросов. Помогите!
- Список с использованием указателей на Си
- C++. Указатели. Связный список. Как добавить элемент в конец списка? Вопрос для разбирающихся