Задать вопрос
@sddvxd

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

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

Допустим

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

class InfoCar
{
    int hp;
    string color;
    long idCar;
}
  • Вопрос задан
  • 343 просмотра
Подписаться 2 Оценить Комментировать
Решение пользователя Толстый Лорри К ответам на вопрос (2)
@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* адресную арифметику применять нельзя, потому что его размер нам неизвестен.
Ответ написан
Комментировать