Получение первого байта в буфере char * - PullRequest
6 голосов
/ 11 февраля 2009

У меня есть буфер char *, и мне интересно посмотреть на первый байт в буфере char *, что является наиболее оптимальным способом для этого.

РЕДАКТИРОВАТЬ: Исходя из отрицательных голосов, я мог бы хотеть объяснить, почему этот вопрос, я знаю о методах, но в кодовой базе, которую я искал, чтобы получить первые байты, люди делают все виды сумасшедших вещей, как делают копию буфер, скопируйте его в поток и затем выполните get.

Ответы [ 8 ]

18 голосов
/ 11 февраля 2009

Просто используйте

char firstByte = buffer[0];
13 голосов
/ 11 февраля 2009

Или это:

char firstByte = *buffer;

Для пояснения, нет никакой разницы между *buffer и buffer[0], так как последний действительно просто сокращение для *(buffer + 0*sizeof(char)), и любой компилятор будет достаточно умен, чтобы заменить его на *(buffer+0) и затем *buffer. Таким образом, выбор действительно зависит от того, в каком контексте вы его используете, а не от того, насколько он эффективен.

5 голосов
/ 11 февраля 2009
char *buffer = {'h','e','l','l','o','\0'};

или

char *buffer = "hello";

или

char buffer[6] = {'h','e','l','l','o','\0'};

и получить первый байт:

char firstChar = buffer[0];

или

char firstChar = *buffer; // since the buffer pointer points to the first element in the array
2 голосов
/ 11 февраля 2009

Если вы настроены на микрооптимизацию, вы должны знать, что каждый компилятор, созданный в этом тысячелетии, должен производить точно такой же машинный код для "c = * buffer" и "c = buffer [0]".

1 голос
/ 11 февраля 2009

Так же, как разъяснение того, что упомянули несколько человек, - это:

buffer[0]

эквивалентно

*(buffer + 0*sizeof(char))

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

Из-за арифметики с указателями, когда вы добавляете целое число к указателю, оно автоматически умножается на sizeof(*pointer), поэтому оно должно быть действительно:

*(buffer + 0)

Хотя, поскольку sizeof(char) определено как 1, в данном случае оно фактически эквивалентно.

1 голос
/ 11 февраля 2009
char first = someCharPtr[0];

или

char first = *someCharPtr;
0 голосов
/ 11 февраля 2009

Хорошо для платформ x86 ...

char firstByte;

__asm {
   mov al, [buffer]
   mov [firstByte], al
}
0 голосов
/ 11 февраля 2009
char* c_ptr;
char first_char;

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