为什么此代码删除前 3 个字符?

Why this code removes first 3 char?

我正在学习 C,我找到了这个程序,但我不明白为什么它会删除前三个字符。这背后的数学原理是什么?

#include <stdio.h>
#include <conio.h>

void main(void){
    int *ptr;
    char *str="hello world";
    char *s_ptr;
    ptr = (int *)str;
    ptr++;
    s_ptr = (char *) ptr;
    printf("%s", --s_ptr);
    _getch();
}

sizeof(int)在你的平台上好像是4个字节。当您执行 ptr++ 时,指针会增加 4 个字节,而不是您预期的增加 1 个字节,因为指针 ptr 的类型是 int 而不是 char.

您正在尝试了解“如何”而不是“为什么”。一个 char 跨越 8 位,也称为一个字节。一个整数在 32 位机器上跨越 4 个字节。在 C 中,您可以对指针进行算术运算。当您写入 ptr++ 时,ptr 指向的地址会增加与其指向的类型相同的字节数。在您的情况下,它增加了 4 个字节。下一行将 s_ptr 转换为 char*s_ptr 指向 hello world 中的 o)。下一行减去 1,所以现在它指向 o 之前的 lprintf 完成剩下的工作。所以请记住:您可以对指针进行算术运算,这取决于大小。