关于C中指针递减的困惑

标签 c pointers pointer-arithmetic

考虑以下程序:(参见现场演示 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)

类似地,这将继续,直到 i0,这是最后一次迭代,即 *(ptr+0) 。它打印 a

关于关于C中指针递减的困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32242592/

相关文章:

c++ - 运行时检查错误3以防万一

c++ - 在 C++ 中声明长文字时是否需要长后缀和无符号后缀?

c - C中void指针的指针算法

c++ - 用于多级指针取消引用?

c++ - 使用指向 vector 中项目的指针,并从 vector 中删除项目

c++ - 定义具有任意跨度的指针

c++ - "this"指针上的指针运算

c - 使用 .d-dependency-file 时 makefile 先决条件重建失败

c++ - 为什么我的 C++ 代码比 LeetCode 上的 C 代码慢三倍?

c - 反对作废*