@sddvxd

На что указывают указатели?

Вникаю в суть отладок программ, дошел до указателей. В книжке которую я читаю слишком профессионально написано. Из какой-то статьи прочитал, что указатели указывают на область памяти, в которой хранится структура, а по смещению байт можно спустится на нижние поля структуры. Если я правильно понял и правильно сформулировал для себя определение, то что можно считать структурой? Экземпляр класса?

Допустим

class Car
{
    infoCar* examplePointer; // Указатель на структуру
}

class InfoCar
{
    int hp;
    string color;
    long idCar;
}
  • Вопрос задан
  • 337 просмотров
Решения вопроса 2
15432
@15432
Системный программист ^_^
Указатель это адрес оперативной памяти, где расположен экземпляр класса. По этому адресу хранятся значения всех свойств этого экземпляра класса, а также указатель на таблицу методов и статических членов класса (общая для всех экземпляров)

Указатель на обычную переменную типа int - всего лишь адрес памяти, где расположено значение этой переменной.

Указатель на функцию - адрес памяти, где хранится код функции.

Ну и так далее
Ответ написан
@Free_ze
Пишу комментарии в комментарии, а не в ответы
Указатель указывает на базовый адрес (первый байт) экземпляра типа. В вашей структуре там лежит член hp типа int, его адрес совпадает с базовым. Он занимает sizeof(int) байт. То есть color находится по адресу базовый адрес + sizeof(int). Следующий член idCar находится по адресу базовый адрес + sizeof(int) + sizeof(string) и так далее. Но на это полагаться опасно, т.к. существует такое понятие, как выравнивание: часто операционные системы выравнивают данные по границе машинного слова. Т.е. если в нашей архитектуре машинное слово - 4 байта, а член структуры занимает 3 байта (char[3]), то будет добавлено пустое пространство в 1 байт и следующий член разместится по адресу адрес char-массива + sizeof(char[3]) + 1

Тип указателя определяет, на какое количество байт будет происходить смещение указателя при адресной арифметике. Т.е. char* смещается на 1 байт, int* (при sizeof(int) == 4) на 4 байта, к void* адресную арифметику применять нельзя, потому что его размер нам неизвестен.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы