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;

    }

2 つの for ループに対して別の関数を作成しようとしましたが、それでも機能しません。このforループが印刷されない理由を知りたいのですが、その下の2つの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 は機能しません (上記を参照)。なぜそれは初期条件では機能せず、後者の条件では機能しますか。

4

4 に答える 4

8

うわあ!

これ:

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

は非常に間違っており、メモリを上書きしています! なぜ指数を掛けるのですか?それを行う必要はありません.Cはそれ自体でインデックスを作成できます。次のようにする必要があります。

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

あなたはi:th 配列メンバーのアドレスが欲しいので、奇妙な乗算で茂みを打ち負かさないでください。

コメントに記載されているように、本当に「ポインターを使用する」必要がある場合は、次のようにします。

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

arrayは配列の最初の要素へのポインタであり、への加算iはポインタ演算の完全に有効な使用であるため、これは機能します。intC は、配列内の各サイズを認識して、適切なポインターを計算します。

于 2013-07-10T08:13:01.000 に答える
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 型であるiため、コンパイラによっては int が 4 バイトであるため、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 に答える