【问题标题】:Array doesn't print in reverse in C using pointers数组不使用指针在 C 中反向打印
【发布时间】:2013-07-08 01:56:30
【问题描述】:

我正在尝试制作一个程序,该程序将 10 个数字作为输入并使用 C 中的指针以相反的顺序输出它们。

    #include<stdio.h>
    #define N 10

    int array[N]; //Global variable


    int main(void) {
    int j;
    int i;

    printf("Enter 10 numbers: ");

    for (i=0;i<N;i++) {
          scanf("%d",(array+(4*i)));    //Works
    }

    for (j=N-1;j<0;j--) {
       printf("%d",array[j]);  //Doesn't print, using *(array+j*4) doesn't 
                                                           //print  also
    }

    printf("\n");
    printf("%d\n",*(array)); //Works so scanf works
    printf("%d\n",*(array+4)); //Works so scanf works
    return 0;

    }

我已经尝试为两个 for 循环创建一个单独的函数,但它仍然不起作用。我想知道为什么这个 for 循环不打印,但它下面的两个 printfs 打印。

编辑:

我的新代码是

    #include<stdio.h>
    #define N 10

    int array[N]; //Global variable


    int main(void) {
    int j;
    int i;

    printf("Enter 10 numbers: ");

    for (i=0;i<N;i++) {
          scanf("%d",(array+i));    //Works
    }

    for (j=N-1;j<0;j--) {    //it is supposed to be j>=0 or j>0 WHY
       printf("%d",array[j]);  //Doesn't print, using *(array+j) doesn't 
                                                           //print  also
    }

    printf("\n");
    printf("%d\n",*(array)); //Works so scanf works
    printf("%d\n",*(array+1)); //Works so scanf works
    return 0;

    }

感谢所有帖子,我现在对 C 中的索引如何工作有了更好的理解,但 printf 仍然无法工作,除非我更改 for 循环条件(见上文)。为什么它不适用于初始条件但适用于后一种条件。

【问题讨论】:

  • 您的概念:与4 相乘是错误的,您只需添加i 即可指向下一个位置。 (array+(4*i)) 错了!只需(array+ i) 就足够了。当您增加一个指针时,它开始指向其类型的下一个元素,无论大小。
  • the printf doesn't work still 因为 for 条件应该是:j &gt;= 0 因为数组索引以 0 开头,您正在从高索引读取数组到低索引(反向)
  • 谢谢@GrijeshChauhan。我不知道它是如何跳过我的想法的,我会支持你的评论。另外,感谢您的阅读。

标签: c arrays sorting pointers printf


【解决方案1】:

哇!

这个:

scanf("%d",(array+(4*i)));    //Works

非常错误,正在覆盖内存!你为什么要乘以索引?你不需要这样做,C 可以自己索引。它应该是:

scanf("%d", &array[i]);

你想要i:th 数组成员的地址,这么说吧,不要用奇怪的乘法拐弯抹角。

如果您真的想“使用指针”,如评论中所述,您可以这样做:

scanf("%d", array + i);

这是有效的,因为array 是指向数组第一个元素的指针,而将i 添加到是指针算法的完全有效使用; C 将计算正确的指针,知道数组中每个 int 的大小。

【讨论】:

  • 如果赋值是关于指针的,那么array+i 可能就是我们想要的。
  • @jxh 好点(呵呵),感谢您指出这一点。我更新了。
  • 感谢您的回答。我知道 C 可以自己索引,但我仍然不明白为什么我的索引方法不起作用。这个数组中的每个地址不是由四个字节分隔的,因为它是一个 int 数组。我只是想弄清楚为什么它不起作用。另外,覆盖内存是什么意思?对不起,如果我的问题有点无聊... :(
  • @user2466887 使用指针的加法与使用数字的方式不同:如果p 是指向 32 位机器上的int 的指针,则p + 1 等于(char*)p + 4
  • @user2466887 在 scanf a int 中,您需要要存储的地址位置,但对于 printf,您只需要值,因此在 printf 中使用具有相同格式字符串的 *(array + i)
【解决方案2】:
for (j=N-1;j<0;j--) {
    printf("%d",array[j]);  //Doesn't print, using *(array+j*4) 
}

for 循环不正确。正确的是那个

for (j = N - 1; j > 0; j--)

【讨论】:

  • 实际上它应该是 j>-1 以便显示所有 10 个值,但为什么。 j 不是一开始是 9,然后它开始递减,直到它达到 -1,然后循环停止,因为条件不满足?
【解决方案3】:

您的数组由 10 个类型为 int 的元素组成(显然)。在表达式 array + i 中,变量 i 不是字节偏移量。它是元素的索引。因此,当您像以前一样阅读它时 (scanf("%d",(array+(4*i)))),您基本上会阅读 array[0], array[4], array[8], array[12] (我们已经超出了数组范围,它会导致内存损坏并可能导致崩溃)等。元素数组[1]、[2]、[3]、[5]等未初始化。这就是你的代码不起作用的原因:)

更新: @shilong-liu 关于数组索引的注释也很重要。我没注意到。

【讨论】:

  • 这是对数组索引的一个非常好的和简单的解释。谢谢。
【解决方案4】:

我猜由于使用的指针是 int 类型,因此您假设您必须将 i 乘以 4,因为取决于编译器 int 是 4 个字节。我想如果你真的只关心输出,那么你可以像反向迭代那样做。

其他人已经提到了你必须做的事情,所以我会给你我的解决方案,以实际交换指针内存,你可以从给定的解决方案中进行选择:

    #include<stdio.h>
        #define N 10

        int array[N]; //Global variable


        int main(void) {
              int j;
              int i;

              printf("Enter 10 numbers: ");

              for (i=0; i<N; i++) {
                    scanf("%d", (array + i));
              }

              for (left = 0; left < N / 2; left++)
              {
                  int right = N - left - 1;
                  int temporary = array[left];
                  array[left] = array[right];
                  array[right] = temporary;
              }  

              for (i=0; i<N; i++) {
                    printf("%d", (array + i));
              }

              return 0;

        }

我一直在为算法竞赛编程,所以你可以相信我。

【讨论】:

    猜你喜欢
    • 2021-01-12
    • 2021-12-09
    • 2022-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多