如果我想对指向一个字节的指针进行操作,我应该使用void*或char*,因为我听说
sizeof(char)
并不总是1个字节,那么void*呢?如果我这样做了
void *p
++p
它会再指向每个地方一个字节吗?
发布于 2012-03-24 08:24:45
在C中,没有为空指针定义指针算法。指针运算本质上与指向类型的大小有关。对于void *
,指向类型的大小是未知的。
要查看不同对象的指针算法是如何工作的,请尝试以下命令:
int obj[5];
int *ip = obj;
char *cp = (char *)obj;
ip++;
cp++;
printf("%p\n%p\n", ip, cp);
但是,如果编译器支持它,则空指针上的指针算术与字符指针上的工作方式相同。
发布于 2012-03-24 08:28:28
为此,我认为您应该使用<stdint.h>
。它定义了以下类型(以及其他类型):
uint8_t Always 1 byte (assuming 8-bit bytes, as is nearly ubiquitous)
uint16_t Always 2 bytes
uint32_t Always 4 bytes
uint64_t Always 8 bytes
如果你知道自己在做什么,并且想要在内存中进行指针运算,那么可以使用uint8_t*
指针。(是的,我只是把它当作动词,顺便说一句。)
示例:
uint8_t* p = <Some Base Addr>;
while (*p) // p points to non-null byte
{
*p ^= 0xA5; // XOR the byte with A5
p++; // Increment to the next byte.
*(uint32_t*)p = 0xDEADBEEF; // Write a 32-bit (DWORD)
((uint32_t*)p)++; // Increment p by 4 bytes
}
发布于 2012-03-24 09:38:16
根据定义,char
占用单字节的存储空间,因此,如果您希望根据字节大小进行地址计算,请使用char *
。虽然C标准要求void *
具有与char *
相同的表示形式,但void *
没有携带大小信息,因此不能用于指针运算。
如果您实际上想要了解对象表示的细节,请使用unsigned char
,因为char
可能是有符号的,并且没有指定为无填充。
现在,关于Jonathon's answer的评论
虽然stdint.h
的固定宽度整数类型也是无填充的,您可以在特定的体系结构上使用它们(如果您不需要可移植性,那么特定于平台的代码没有什么问题),但通常您只知道它们的位宽,而不知道它们的字节大小,因为CHAR_BIT
可以不同于8(对于嵌入式世界的某些部分,16和32是“常见的”)。但是,对于POSIX系统,字节==八位字节是必需的。
不需要存在特定大小的固定宽度整数类型:特别是,如果CHAR_BIT
不是2的幂(是的,存在这样的体系结构),则uint8_t
、uint16_t
、uint32_t
和uint64_t
类型都不能存在
https://stackoverflow.com/questions/9850198
复制