Какова реальная структура указателя? - PullRequest
1 голос
/ 22 ноября 2010

Как я уже понял, указатель - это место в памяти (куче), где хранится адрес памяти, я действительно понимаю это и могу так легко с ним справиться, но вопрос в том, хранит ли он только адрес, тогда его размер симметричен размеру памяти компьютера, и поэтому все указатели имеют одинаковый размер , тогда почему указатели имеют типы, например, если указатель X определен как целое число, он имееттот же размер, что и у Y poiter, который определен как char, почему возникает ошибка компилятора или времени выполнения, когда я присваиваю адрес типа double - или diffrenet любого типа от целого числа - X и то же самое для Y?есть ли дополнительный компонент в структуре указателей, который определяет тип?

Я просто хочу узнать реальную структуру указателей, как именно они работают и почему у них есть типы.

Спасибозаранее:)

ПРИМЕЧАНИЕ: если мне нужно указать язык, это C ++

Ответы [ 4 ]

3 голосов
/ 22 ноября 2010

Вы правы, указатель содержит только адрес памяти, поэтому все указатели на данном компьютере имеют одинаковый размер.

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

1 голос
/ 22 ноября 2010

Я не знаю реальной структуры указателей (мне понравилась идея, поэтому я посмотрю на тему, которая, я думаю, вы можете найти что-то об этом в теории автоматов и разработке языков программирования или в написании тем для компиляторов), ноЯ думаю, что у указателей есть типы данных, поэтому компьютер знает, на какой объем памяти указывает указатель, другими словами, рассмотрим указатель, который указывает на двойное число. Я думаю, что указатель указывает на адрес первого слова размера, равного двойному.принимает, но учтите, что вы хотите вывести на экран двойное число, если указатель не имеет типа, соответствующего значению, на которое он указывает, как компьютер узнает, сколько байтов должно быть напечатано на экране!

0 голосов
/ 22 ноября 2010

Указатель при инициализации указывает на первый байт данных, на которые он указывает. Например, если указатель int указывает на данные, например, 45, то указатель может указывать на значение 4 или 5 (в зависимости от конечности машины). Аналогичным образом двойной указатель будет указывать на первый байт в памяти данных, на которые он указывает.

Таким образом, все указатели имеют одинаковый размер.

Теперь, в зависимости от типа указателя, доступ к данным из памяти. Таким образом, на 16-битном компьютере, где int является 16-битным, две байтовые данные ссылаются (включая начальный байт из памяти, на который указывает указатель, и следующий непосредственный байт) из памяти, когда этот указатель разыменовывается. Аналогичным образом на 4 байта будут ссылаться, когда разыменовывается длинный указатель.

Так работает разыменование указателя в целом. Короче говоря, указатели имеют тип для правильного разыменования данных. И все указатели по существу имеют одинаковый размер, то есть 1 байт. Надеюсь, я достаточно ясно.

0 голосов
/ 22 ноября 2010

Я думал, что указатель хранится в стеке и указывает на местоположение в куче?

Указатели имеют «типы», как и переменные, чтобы обеспечить безопасность типов и позволить вам обнаруживать проблемы во время компиляции. Но учтите, что это только во время компиляции (во всяком случае, в C).

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...