使用指针,数组不会在C中反向打印

时间:2013-07-10 08:11:55

标签: c arrays sorting pointers printf

我正在尝试创建一个以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循环不打印,但它下面的两个printf打印。

编辑:

我的新代码是

    #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中索引的工作方式有了更好的了解,但除非我改变了for循环条件,否则printf仍然不能正常工作(见上文)。为什么它不适用于初始条件,但适用于后者条件。

4 个答案:

答案 0 :(得分:8)

哇!

此:

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

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

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

你想要i:数组成员的地址,所以说,不要用奇怪的乘法来绕过丛林。

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

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

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

答案 1 :(得分:2)

您的数组包含10个类型为int的元素(显然)。在表达式array + i中,变量i不是以字节为单位的偏移量。它是元素的索引。所以,当你像你一样阅读它(scanf("%d",(array+(4*i))))时,你基本上读取了数组[0],数组[4],数组[8],数组[12](我们已经没有数组边界了,它会导致内存损坏并可能导致崩溃)等。元素数组[1],[2],[3],[5]等未初始化。这就是你的代码无效的原因:)

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

答案 2 :(得分: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--)

答案 3 :(得分:0)

我猜因为使用的指针是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;

        }

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