C程序如何产生这样的输出?

pho*_*nie 3 c pointers

void main()
{
    char str[2][7] = {"1234567", "abcdefg"};
    char** p = str;
    printf("%d\n", *(p+1));
    printf("%c\n", *(p+1));
}
Run Code Online (Sandbox Code Playgroud)

输出是:

1631008309
5
Run Code Online (Sandbox Code Playgroud)

编辑:谢谢.我看到'5'只有0x35,除了str [0] [4]我应该是.为什么我不能走出str [0] [4]而不是这个奇怪的1631008309?

天哪,我很愚蠢地问这个问题!谢谢你们,伙计们.

Vic*_*cky 10

你指的是在分配给二维数组的内存开头的一个char**.

当你向指针添加1时,它会向你移动指向的类型的大小,在这种情况下是char*的大小,在你的系统中显然是4个字节.然后你取消引用它并将结果视为int(%d),它给你我在评论中提到的a765来展开.当你取消引用它并将其视为一个char时,你正确得到5.

[我看到放松已经删除了他们的答案,所以为了完整性我会补充说"a765"是你得到的更大数字的ASCII解释(0x61373635).


caf*_*caf 5

这一行:

char** p = str;
Run Code Online (Sandbox Code Playgroud)

没有意义. str是一个包含7个字符的2个数组的数组.在表达式上下文中使用时,它将计算指向其第一个元素的指针,相当于:

&str[0]
Run Code Online (Sandbox Code Playgroud)

其中包含"指向7个字符数组的指针".这绝不是类似于"指向char的指针",这是一种类型p.其中任何一个都有意义:

char *p = str[0];

char *p = str[1];

char (*p)[7] = str;
Run Code Online (Sandbox Code Playgroud)


kma*_*rsh 5

使用%d不会将字母数字的ASCII字符串转换为数字.使用%d意味着它期望找到的值将被解释为数字的二进制表示,并转换为TO ASCII以进行打印.