Что это за указатель в C? - PullRequest
4 голосов
/ 13 июля 2011

Я видел много таких типов, но я понятия не имею, что это значит

unsigned char somevar[MAXLEN];
int *ptr = (int *) somevar;

Может кто-нибудь объяснить?

Ответы [ 6 ]

3 голосов
/ 13 июля 2011

По сути, вы интерпретируете массив символов как указатель на int. Предположим, что sizeof (int) равно 4, а массив char содержит следующие байты:

b0 b1 b2 b3 b4 b5 b6 b7 

Теперь ptr будет указывать на b0, но угрожать ему как int. То есть

ptr[0] - это целое число, состоящее из байтов b0, b1, b2, and b3
ptr[1] - это целое число, состоящее из байтов b4, b5, b6, and b7

НТН

1 голос
/ 13 июля 2011

Просто somevar будет интерпретироваться как последовательность int (или только один) через указатель ptr.Инкремент ptr только один раз перемещает указатель на sizeof(int) байтов вперед.

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

Также убедитесь, что длина somevar кратна sizeof(int), в противном случае вы получите неопределенное поведение при попыткедоступ к последнему int, так как он будет частично доступен.

0 голосов
/ 13 июля 2011

Это указатель на первое значение массива. Поскольку это беззнаковый символ, он должен быть приведен к типу как int (ну, это не обязательно, но это хорошая практика). Что касается кого-то по поводу размера, то размер int по большей части всегда будет меньше, чем беззнаковый символ.

0 голосов
/ 13 июля 2011

С правой стороны это указатель на int.

С левой стороны это переменная (somevar) неизвестного типа, которая приводится к указателю на int.Можно посоветовать взглянуть на сомар критическим взглядом.Иногда приведение в C необходимо;но чаще приводят к C в знак того, что был выбран неправильный тип для somevar или что вы делаете что-то, что вряд ли будет переносимым.

В этом случае вы упаковываете символы в целые.В зависимости от системы вы можете получить int с внутренним битовым представлением, которое соответствует [char0, char1, char2, char3], за которым следует другое int с внутренним битовым представлением, которое соответствует символам с четвертого по седьмой.

Однаков некоторых других системах вы можете получить int с внутренним битовым представлением [char3, char2, char1, char0].Наконец, существуют другие системы, которые обрабатывают порядок битов еще более по-разному.

Шансы хороши, что если вы покопаетесь в коде достаточно, вы обнаружите, что есть еще одно место, где указатель на ваш "созданный" int получаетбросить обратно в чар *.

0 голосов
/ 13 июля 2011

Это часто делается, когда вы читаете несколько необработанных байтов, скажем, из двоичного файла или из сетевого сокета, и вы знаете (из формата данных или протокола), что эта последовательность байтов представляет целое число.Это даст вам указатель, который вы можете разыменовать и получить целочисленное значение, представленное этими байтами.

0 голосов
/ 13 июля 2011

Идентификатор массива в C является указателем на первый элемент массива. Итак, в вашем примере somevar - это беззнаковый символ *, указывающий на первый элемент массива, объявленный в первой строке фрагмента.

И тогда совершенно ясно, что ptr также является указателем на первый элемент массива, но благодаря типу трансляции он рассматривает его как целое число со знаком.

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

...