我有一个char *缓冲区,我有兴趣查看char *缓冲区中的第一个字节,最佳方法是什么。
编辑:根据负面投票,我可能想解释为什么这个问题,我知道方法,但在代码库,我一直在寻找获得第一个字节的人做各种疯狂的事情,如做副本缓冲区,将其复制到流然后执行get。答案 0 :(得分:18)
只需使用
char firstByte = buffer[0];
答案 1 :(得分:13)
或者这个:
char firstByte = *buffer;
为了澄清,*buffer
和buffer[0]
之间没有区别,因为后者实际上只是*(buffer + 0*sizeof(char))
的简写,并且任何编译器都足够聪明以用{替换它' {1}}然后*(buffer+0)
。因此,在您使用它的上下文中,选择实际上是最清楚的,而不是每个选项的效率。
答案 2 :(得分:5)
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
答案 3 :(得分:2)
如果您决定进行微优化,您应该知道在这个千年中制作的每个编译器都应该为“c = * buffer”和“c = buffer [0]”生成完全相同的机器代码。
答案 4 :(得分:1)
char first = someCharPtr[0];
或
char first = *someCharPtr;
答案 5 :(得分:1)
正如对几个人所提到的那样的澄清 - 那就是:
buffer[0]
相当于
*(buffer + 0*sizeof(char))
如果你假设它是字面上的C代码(即非伪代码),那在技术上并不正确,尽管编译器正在为你做这些。
由于指针运算,当你向指针添加一个整数时,它会自动乘以sizeof(*pointer)
,所以它应该是:
*(buffer + 0)
虽然,因为sizeof(char)
被定义为1,所以在这种情况下它实际上是等效的。
答案 6 :(得分:0)
char* c_ptr;
char first_char;
first_char = c_ptr[0];
答案 7 :(得分:0)
适用于x86平台...
char firstByte;
__asm {
mov al, [buffer]
mov [firstByte], al
}