4

我正在尝试制作一个程序,该程序将 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

4 回答 4

8

哇!

这个:

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

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

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

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

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

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

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

于 2013-07-10T08:13:01.000 回答
2

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

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

于 2013-07-10T08:31:15.770 回答
1
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--)
于 2013-07-10T08:24:42.087 回答
0

我猜由于使用的指针是 int 类型,你假设你必须乘以i4,因为取决于编译器 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;

        }

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

于 2013-07-10T08:44:41.973 回答