9

私はCプログラミングが初めてで、これが私の問題です:

各配列の最初の値を新しい配列に格納し、次に各配列の 2 番目の値を新しい配列に格納したいと考えています。

ポインターの配列を宣言することはできましたが、その使用方法がわかりません!

助けが必要です。

int main()
{
    int t1[4]={0,1,2,3};
    int t2[4]={4,5,6,7};
    int t3[4]={8,9,10,11};
    int t4[4]={12,13,14,15};
    int *tab[4]={t1,t2,t3,t4};
    int i,j,k,l;
    for (i=0; i<4;i++)
    {
        printf("%d\t", *tab[i]);
    }

    return 0;
}

これを行うとき、各配列の最初の値だけを保存します。

4

4 に答える 4

13

あなたの用語はあちこちに少しあります。あなたの質問に答える最も簡単な方法は、コードを 1 行ずつ見ていくことだと思います。

int main()
{
int t1[4]={0,1,2,3};      //Declares a 4 integer array "0,1,2,3"
int t2[4]={4,5,6,7};      //Declares a 4 integer array "4,5,6,7"
int t3[4]={8,9,10,11};    //Declares a 4 integer array "8,9,10,11"
int t4[4]={12,13,14,15};  //Declares a 4 integer array "12,13,14,15"
int *tab[4]={t1,t2,t3,t4};//Declares a 4 pointer of integers array "address of the first element of t1, address of the first element of t2, ..."
int i,j,k,l;              //Declares 4 integer variables: i,j,k,l
for (i=0; i<4;i++)
 {
  printf("%d\t", *tab[i]); //print out the integer that is pointed to by the i-th pointer in the tab array (i.e. t1[0], t2[0], t3[0], t4[0])
 }

 return 0;
 }

あなたがしていることはすべて、あなたのループまで問題ないようです。それらを通過していないため、すべての配列の最初の整数のみを表示しています。それらを反復するには、コードは次のようになります。

for (i=0; i<4;i++)
{
   for (j=0; j<4; j++)
   {
      printf("%d\t", *(tab[j] + i));
   }
}

上記のコードは、2 つのループ カウンターを使用します。1 つ ( i) は、配列内の位置 (配列内の最初の値、配列内の 2 番目の値など) を通過します。もう 1 つは、異なる配列を通過します ( j)。これは、格納されているポインターを取得し、 th 列tab[j]の値を表示するための正しいオフセットを持つ新しいポインターを作成することによって行われます。iこれはポインター演算と呼ばれます (ポインター演算に関する追加情報はこちらにあります) 。

ほとんどの人は構文*(tab[j] + i)がぎこちないと感じますが、実際に何が起こっているかをより説明しています。tab[j][i]C では、より一般的な のように書き直すことができます。

于 2012-07-06T14:01:17.297 に答える
3

意図したとおりにデータを保存しました。適切にアクセスする必要があります

for (i=0; i<4;i++)
{
  for (j = 0; j < 4; j++) {
    int* temp = tab[i];    
    printf("%d\t", temp[j]);      // or try the next line...
    printf("%d\t", *(temp + j));  // prints same value as above line
    printf("%d\t", tab[i][j];     // the same value printed again
  }
}   

上記はすべて同じ値を出力します。これは、ポインター演算を使用してその値にアクセスする方法が異なるだけです。の各要素tabは、各の値は、開始時に定義された他の配列int*のアドレスですint[]

編集:ジェロームのコメントに応えて、4つの配列を宣言することでそれを達成できます

int tab1[4]={*t1,*t2,*t3,*t4};
int tab2[4]={*(t1+1),*(t2+1),*(t3+1),*(t4+1)};
int tab3[4]={*(t1+2),*(t2+2),*(t3+2),*(t4+2)};
int tab4[4]={*(t1+3),*(t2+3),*(t3+3),*(t4+3)};

tab1各配列の最初の要素、2 番目の要素などを含むようになりましtab2た。次に、使用できます

 int *tttt[4]={tab1,tab2,tab3,tab4};
 for (i=0; i<4;i++) {
   for (j = 0; j < 4; j++) {
     printf("%d\t", tttt[i][j]);   
   }
 } 

必要なものを印刷します。最初に行ったように別のポインター配列を宣言した場合

  int* tab[4] = {t1,t2,t3,t4};

次に、本質的に行列の用語で、ttttの転置ですtab

于 2012-07-06T13:47:42.953 に答える
1

あなたはすべてを保存しますが、それを表示しません。試す

for (i=0; i<4;i++)
 {
  for (j=0; j<4; j++)
  printf("%d\t", *(tab[i]+j));
 }
于 2012-07-06T13:38:33.977 に答える