C位操作字符数组
我有一个指向无符号字符数组的指针,例如C位操作字符数组,c,bit-manipulation,C,Bit Manipulation,我有一个指向无符号字符数组的指针,例如无符号字符*uc_数组。如果我将地址指向的内容向右移动8位,它们将位于uc_数组+1?移动内容将修改其值,而不是在内存中移动它。否。。。。如果取消引用指针*uc_array++,则会增加指针指向的值。但是,如果执行此操作,uc_数组+++则会增加指针的地址,该指针指向*uc_数组返回的“下一个相邻值” 不要忘记,指针算法取决于指针的类型的大小,对于字符指针,它是1,对于int,它是4,这取决于所使用的平台和编译器…您的问题只有在解释为 memmove(uc_
无符号字符*uc_数组
。如果我将地址指向的内容向右移动8位,它们将位于uc_数组+1
?移动内容将修改其值,而不是在内存中移动它。否。。。。如果取消引用指针*uc_array++
,则会增加指针指向的值。但是,如果执行此操作,uc_数组+++
则会增加指针的地址,该指针指向*uc_数组
返回的“下一个相邻值”
不要忘记,指针算法取决于指针的类型的大小,对于字符指针,它是1,对于int,它是4,这取决于所使用的平台和编译器…您的问题只有在解释为
memmove(uc_array + 1, uc_array, bytesize_of_array);
我假设您在8位字节平台上,移位意味着在解释为连续字节的长位序列时移位位(数组后需要有一个字符来解释移位)。实际上,存储在地址uc\u数组
的值将存储在uc\u数组+1
中
但是如果你做这样的循环
for(unsigned char *x = uc_array; x != uc_array + byte_count; ++x)
*x >>= 8;
假设8位字节,你会把所有的都置零,一个字节一个字节地移动掉所有的位 否。对值的修改仅影响该值,而不影响相邻值。这包括轮班操作员
移位运算符移出的位“丢失”。这取决于数据的移位方式。如果您这样做(quint16)(*uc_数组)>>8,那么第一个字节将移动到第二个字节。但是如果只做(*uc_数组)>>8,那么,正如其他人所说,您将清空您的数据。他们仍将在
uc_数组+
中(post inc.)。注意:我将OP的uc_数组+
更改为uc_数组+1
。