2016-04-22 4 views
2

Я понимаю, что указатели на любой тип данных будут иметь одинаковый размер. В 16-битной системе обычно 2 байта и 32-битной системе - 4 байта.Как компилятор знает, как увеличивать разные указатели?

В зависимости от того, что этот указатель указывает на, если он увеличивается, она будет увеличиваться различным числом байтов в зависимости от того, если это указатель голец, длинный указатель и т.д.

Мой запрос как знает компилятор по количеству байтов для увеличения этого указателя. Разве это не переменная, хранящаяся в памяти, как любая другая? Являются ли указатели хранятся в некоторой таблице символов с информацией о том, сколько они должны быть увеличены? Спасибо

+1

C строго типизирован, размер типа должен быть известен во время компиляции , Когда размер известен, компилятор знает, как это сделать. – user3528438

+0

LOL! 'C строго типизирован' –

+0

@MartinJames Что? Что вы LOL'ing? Вы хоть представляете, сколько клавиатур (ключей) я потерял при написании кода C? : P –

ответ

2

Именно поэтому существуют типы данных. Каждая переменная указателя будет иметь связанный тип данных и что тип данных имеет определенный размер (см. Полный/неполный тип в сноске). Арифметика указателя будет выполняться на основе типа данных.

Чтобы добавить к этому, для арифметики указателей произойдет, указатель (s) следует (цитата из c11 стандарта)

указатель на полный тип объекта

Так, размер «объекта», указатель указывает на, известен и определен.

Сноска: FWIW, поэтому арифметика указателей на указатели пустоты (неполный тип) не разрешена/не определена в стандарте. (Though GCC supports void pointer arithmetic via an extension.)

1

Re

Я понимаю, что в общем, указатели на любой тип данных будет иметь тот же размер

No. размеры Different указатель необычны для ¹simple указателей на объекты, но может возникать на машинах, написанных на языке. Тогда char* является наибольшим указателем, а void* - того же размера.

C++ 14 §3.9.2/4

Объект типа сортаvoid* должны иметь одни и те же требования представительства и выравнивания как сортаchar*.

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


Re

как компилятор знает, на сколько байтов, чтобы увеличить этот указатель

Он знает размер типа указываемого объекта.

Если он не знает размер объекта, на который указывает, т. Е. Этот тип неполный, то вы не можете увеличить указатель.

Например, если p является void*, то вы не можете сделать ++p.

Примечание:
¹ В дополнении к обычным указателям на объекты, есть указатели на функции и указатели на член. Последний тип больше похож на смещения, которые должны быть объединены с некоторой спецификацией соответствующего объекта, чтобы дать ссылку.

0

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

например: 1) при увеличении указателя на символ указатель увеличивается на 1 байт. 2) Аналогично, для целочисленного указателя указатель увеличивается на 4 байта (для 32-разрядной системы) и 8 байтов (для 64-разрядной системы)

+0

Поскольку данные (char или int) будут храниться в другом сегменте памяти в коде, как код знает, в каком способ увеличения переменной или указателя? Переменные хранятся в таблице символов? – Engineer999

+0

Переменные сохраняются либо в стеке (локальные переменные), либо в сегменте данных (глобальные переменные), тип данных не имеет ничего общего с сегментом, который должен быть сохранен в 2) Таблица символов содержит только ссылки на функцию и не varibles – Rjain

+0

Когда мы говорим о мы ссылаемся на адреса в памяти. когда вы объявляете указатель на переменную, ваш указатель теперь указывает на эту ячейку памяти. Всякий раз, когда вы увеличиваете или уменьшаете указатель, он будет выполнять операции относительно этой ячейки памяти. – Rjain

Смежные вопросы