考虑以下程序:(参见现场演示 here)
#include <stdio.h>
int main(void)
{
char c[]={'s','h','r','e','y','a','\0'};
char *ptr=c;
for(int i=0;i<6;i++)
printf("%c",ptr[i]);
printf("\n");
char (*s)[7];
s=&c;
for(int i=0;i<6;i++)
printf("%c",(*s)[i]);
printf("\n");
ptr=&c[5]; // ptr points to 6th char of string
for(int i=5;i>=0;i--)
printf("%c",ptr[i]);
}
该计划没有给出预期的结果。我得到的结果是:
夏亚
夏亚
一个
但是如果我像下面这样写最后一个循环,它就可以正常工作。
for(int i=5;i>=0;i--)
printf("%c",c[i]);
关于指针,我在这里理解错了什么?为什么我在最后一个 for 循环中编写 printf("%c",ptr[i]);
时只得到最后一个字符作为输出。
最佳答案
做作业的时候
ptr=&c[5];
您使 ptr
指向数组的 fifth
元素,即 a
。现在在循环中你正在打印 ptr[i]
。
让我们从循环的开头开始,看看它打印了什么。
*(ptr+5)
,远远超出数组 c[]
。
{'s','h','r','e','y','a','\0'};
^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^
0 1 2 3 4 5 6 G G G G //G -> Garbage
^ ^
ptr (ptr+5)
类似地,这将继续,直到 i
为 0
,这是最后一次迭代,即 *(ptr+0)
。它打印 a
关于关于C中指针递减的困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32242592/