用指针修改字节

时间:2013-04-25 17:45:59

标签: c++ c pointers

long double i, *ptr;
ptr = &i;

我想修改字节No.4的值。长double的大小是8字节。那么可以从* ptr中减去4吗? 即

(ptr)-4 = 9;

4 个答案:

答案 0 :(得分:7)

您可以通过将指向对象的指针转换为指向unsigned char的指针然后通过该指针访问字节来访问表示对象的字节。例如,i的第四个字节可以通过以下方式设置为9:

unsigned char *p = (unsigned char *) &i;
*(p+4) = 9;

然而,你没有充分理由不这样做。它遇到了可移植性问题,只能用于特殊目的,并且要特别注意C标准和/或C实现的文档。如果你进一步解释为什么要做这样的事情,可能会有更好的方法来解释它或解释危险。

请注意,问题中使用的字节4(字节0处的起始编号)的正确地址为p+4,而不是p-4

答案 1 :(得分:3)

我会尝试更具可读性的东西

union {
    long double d;
    char v[sizeof(long double)];
} x;

x.d = 1234567890;
std::cout << x.d << ' ' << int(x.v[6]) << std::endl;
x.v[6] = 0xCC;
std::cout << x.d << ' ' << int(x.v[6]) << std::endl;

产量

1.23457e+09 44
1.23981e+09 -52

答案 2 :(得分:0)

(*ptr)-4 = 9是不允许的,因为它会导致RValue违规(分配操作的右侧不能是另一个操作)。

但您可以使用位操作,例如:

(*ptr) = (*ptr) & 0x00009000;

答案 3 :(得分:0)

首先看到这里:How do you set only certain bits of a byte in C without affecting the rest?。我们的想法是清除您感兴趣的字节,然后使用或操作设置您的值。所以在你的情况下你会这样做:

val &= ~0xff;    // Clear lower byte
val |= 9 & 0xff; // Set Nine into the least significant byte.