C语言中能否对uint64_t指针下标访问获取部分字节内容?
解答
你的理解完全正确,针对两个疑问具体说明如下:
- 对
uint8_t first_byte = ((uint8_t *)num_ptr)[0];的逻辑拆解完全符合C语言的语法规则:- 第一步
(uint8_t *)num_ptr是将原本指向uint64_t类型的指针,强制转换为指向uint8_t类型的指针,这个转换不会改变指针存储的内存地址,仅修改了指针的步长和内存解读规则:原uint64_t*指针每次偏移移动8字节,强转后的uint8_t*指针每次偏移移动1字节。 - C语言中指针的下标运算
p[i]本质完全等价于*(p + i),因此((uint8_t *)num_ptr)[0]就等价于从num_ptr指向的内存起始地址开始,取偏移量为0的1字节内容,不需要先对原uint64_t*指针做完整的8字节解引用。
- 第一步
- 你提到的「不对指针做完整解引用,直接通过下标索引获取指向内容的部分字节」是完全合法且常用的C语言底层操作,但有两个必须注意的规则:
- 只有转换为指向字符类类型(
char、unsigned char/uint8_t、signed char/int8_t)的指针,才允许逐字节遍历其他类型对象的内存,转换为其他非字符类型指针做类似操作会违反严格别名规则,属于未定义行为。 - 这种方式获取到的字节内容和系统端序直接相关。你运行代码得到159是小端序系统的正常结果:
99999转换为十六进制是0x1869F,补全为8字节uint64_t的完整值为0x000000000001869F,小端序规则下低地址存储值的低有效字节,起始位置的第一个字节是0x9F,转换为十进制就是159;如果在大端序系统上运行同一段代码,第一个字节会取到最高位的0x00,输出结果为0。
- 只有转换为指向字符类类型(
内容的提问来源于stack exchange,提问作者wrosen01
相关产品推荐
相关产品推荐

