簡體   English   中英

數組不會在C中使用指針反向打印

[英]Array doesn't print in reverse in C using pointers

我正在嘗試制作一個程序,以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中如何使用索引有了更好的了解,但是除非我更改for循環條件(請參見上文),否則printf仍然無法正常工作。 為什么不對初始條件起作用,但對后來的條件起作用。

哇!

這個:

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

是非常錯誤的,正在覆蓋內存! 你為什么要乘索引? 您不需要這樣做,C可以自己編制索引。 應該只是:

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

您需要第i個數組成員的地址,也就是說,不要用奇怪的乘法來回敲擊灌木叢。

如評論中所述,如果您真的想“使用指針”,可以這樣做:

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

這是可行的,因為array是指向array第一個元素的指針,將i加到是指針算術的完全有效用法; C將知道數組中每個int的大小,從而計算出適當的指針。

您的數組由10個類型為int (顯然)的元素組成。 在表達式array + i變量中, i不是字節偏移量。 它是元素的索引。 因此,當您像閱讀( scanf("%d",(array+(4*i))) )一樣閱讀時,基本上就讀取了array [0],array [4],array [8],array [12](此處已經超出數組范圍,它會導致內存損壞並可能導致崩潰),等等。元素array [1],[2],[3],[5]等尚未初始化。 這就是為什么您的代碼不起作用的原因:)

更新:@ shilong-liu關於數組索引的注釋也很重要。 我沒注意到

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--)

我猜想因為使用的指針是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;

        }

我一直在為算法競賽編程,所以您可以信任我。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM