C字符串指针。int指针与char指针

C字符串指针。int指针与char指针,c,pointers,c-strings,C,Pointers,C Strings,我想知道为什么*p+1输出k而不是o?我试着用调试器运行这个程序,但似乎仍然无法解决这个问题 char name[] = "john q public"; int *p = name; printf("%c\n", *p+1); // output expected -> o, but got k printf("%c", name[0]); // output as expected ->

我想知道为什么*p+1输出k而不是o?我试着用调试器运行这个程序,但似乎仍然无法解决这个问题

    char name[] = "john q public";
    int *p = name;
    printf("%c\n", *p+1); // output expected -> o, but got k
    printf("%c", name[0]); // output as expected -> j
当我尝试在for循环中输出名称时,会得到奇怪的值

    int  len = strlen(name);
    for(int i=0; i<len; i++ ){
        printf("%c", *p++); //expected -> john q public, but got -> j ucem n 1 
    }

以下几点可能会有所帮助:

printf("%c\n", *p+1);
这是在*p的ascii值上加1,因此'j'+1='k'就是您得到的值。 你想要的可能是:

printf("%c\n", *(p+1));
另外,您创建了一个int指针,但我认为在这个场景中您需要一个char指针

总之,这是我建议的用于获取带有指针的字符串的第一个字符的编辑:

char name[] = "john q public";
char *p = name;
printf("%c\n", *(p));
您不需要+1,因为数组从0开始,为什么是“k”

您声明:

char name[] = "john q public";
在访问时,名称将转换为指向第一个元素的指针,即指向“j”的指针

您分配:

int *p = name;
因此p将存储“j”的地址作为其值,例如p指向“j”。然后打印printf%c\n,*p+1;其中,去引用的p例如*p是字符“j”,而by,j+1==k,因此完全可以预期“k”的输出

j ucem n 1

声明int*p,指针类型控制指针算法。因此,p++通过sizeofint字节(通常为4字节)而不是sizeofchar字节(1字节)来提升p。让我们看看:

    john q public
    -------------
    0123456789012
    ^   ^   ^   ^   4-bytes per p++
    |
    p
增加4个字节,您就有了j uc。。。哪里指示通过访问名称数组末尾以外的内存来调用未定义行为的位置-所有下注均已关闭

始终在启用警告的情况下编译

始终在启用警告的情况下编译,并且在代码编译时没有警告之前不接受代码。为了使警告添加到您的Gcc/CLAN编译字符串中,也考虑添加-WSHIFT来警告阴影变量。对于windows上的VS cl.exe,请使用/W3。所有其他编译器都有类似的选项。阅读并理解每个警告-然后去修复它。他们将确定任何问题,以及出现问题的确切路线。通过倾听编译器告诉您的内容,您可以学到很多东西

如果编译时启用了警告,则会发现:

warning: initialization from incompatible pointer type [-Wincompatible-pointer-types]
 int *p = name;

在p变量中应该使用char*而不是int*。我认为它应该是printf%c\n,*p+1;要打印第二个字符,在for循环中,它将是printf%c*p+ii如果您先输入*p+1,您将得到*p,这是j的值,然后j+1是k。但是,如果将*p+1放在内存中,增加地址,然后从该地址访问值,请阅读编译器诊断消息并将其添加到问题中,即使编译成功,代码在任何兼容的C编译器中都会产生警告。解决方案是取消*x+y的学习。输入p[1]比较困难。你从哪里得到的j uc。。。?不应该是q p,名字后面没有访问权限吗?顺便说一句:ucem是什么意思?你可能会补充说,解引用*p实际上是6A6F686E或6E686F6A,这取决于Endianness。指向j,有未定义的行为,最低的字节是'j',目标架构恰好是小endian,并且。。。