5.3 我有一个 char * 型指针正巧指向一些 int 型变 量, 我想跳过它们。为什么如下的代码 ((int *)p)++; 不行?

在 C 语言中, 类型转换意味着 ``把这些二进制位看作另一种类型, 并作相应 的对待"; 这是一个转换操作符, 根据定义它只能生成一个右值 (rvalue)。而 右值既不能赋值, 也不能用 ++ 自增。(如果编译器支持这样的扩展, 那要么是一个错误, 要么是有意作出的非标准扩展。) 要达到你的目的可以用:
    p = (char *)((int *)p + 1);
或者,因为 p 是 char * 型, 直接用
    p += sizeof(int);

但是, 在可能的情况下, 你还是应该首先选择适当的指针类型, 而不是一味地 试图李代桃僵。

参考资料: [K&R2, Sec. A7.5 p. 205]; [ISO, Sec. 6.3.4]; [Rationale, Sec. 3.3.2.4]; [H&S, Sec. 7.1 pp. 179-80]。

翻译朱群英、孙云, LaTeX2HTML 编译 朱群英 (2005-06-23)