为什么需要转换指针算术?

sha*_*tes 0 c pointers

如果我想迭代一个字符串,在这种情况下'test',我可以像这样使用指针算法来获取下一个字符:

char *c = "test";
*c++;
putchar(*c);
Run Code Online (Sandbox Code Playgroud)

这将打印第二个字母'e'.

但是,如果我想去第三个角色,为什么我不能说:

char *c = "test";
c = *c + 2;        //*c = *c + 2; also doesn't work
putchar(*c);       //Exception thrown: write access violation.
Run Code Online (Sandbox Code Playgroud)

据我所知,使用指针算法获取第三个字符的唯一方法是像这样强制转换它:

char *c = "test";
c = (char *) c + 2;
putchar(*c);
Run Code Online (Sandbox Code Playgroud)

有人可以向我解释为什么会这样吗?

Gop*_*opi 5

c 这是一个保存内存位置地址的指针.

*c被称为取消引用指针,它将给出存储在指向的内存位置的值c.

所以

c = *c + 2
Run Code Online (Sandbox Code Playgroud)

将会

c = (value stored at c) + 2;
Run Code Online (Sandbox Code Playgroud)

这不会给内存位置

c = c + 2;
Run Code Online (Sandbox Code Playgroud)

  • 在C中有一个[运算符的有效优先级](https://en.cppreference.com/w/c/language/operator_precedence),由标准中的语法描述.`++`"比"*更强",所以先发生在这里.如果你只是写`*c ++;`,你实际上忽略了取消引用的结果,但副作用(递增`c`)仍然会发生.IOW,你的`*c ++中的`*`在这里是荒谬的,但不会伤害...... (3认同)
  • 我希望你知道运算符优先级是什么.`++`具有更高的预设值然后`*`所以`*c ++`将被视为`c ++`以及后来的`*c` (2认同)