1
#include<stdio.h>
#include<stdlib.h>

int string_length(int (*s)[10], int L, int W)
{
  int len = 0;
  int i, j;
  for (i = 0; i < L; i++)
  {
    for (j = 0; j < W; j++)
    {
      len++;
      printf("%d ", *(*(s + i) + j));
    }
    printf("\n");
  }
  return len;
}

int main(int argc, char** argv)
{
  int str[20][10] =
  {
    { 2, 1, 3, 1, 1, 1, 1, 1, 1, 1 },
    { 2, 1, 3, 1, 1, 1, 1, 1, 1, 1 },
    { 2, 1, 3, 1, 1, 1, 1, 1, 1, 1 },
    { 2, 1, 3, 1, 1, 1, 1, 1, 1, 1 },
    { 2, 1, 3, 1, 1, 1, 1, 1, 1, 1 } 
  };

  printf("the sizeof this 2d array will be %lu \n", sizeof(str));
  printf("the length of the strings will be %lu \n",
      sizeof(str) / sizeof(str[0]));
  printf("the width of the each string %lu \n",
      sizeof(str[0]) / sizeof(str[0][0]));
  printf("the result is %d \n",
      string_length(str, sizeof(str) / sizeof(str[0]),
          sizeof(str[0]) / sizeof(str[0][0])));

  int i = 0;
  while (i < 10)
    printf("hello %d\n", i), i++;

  return 0;
}

これは、アドレスを介して参照を行うことを考え出した1つの方法です.他にも多くの方法があることを知っています.2D参照を効果的に行う方法を他の方法でリストアップできますか?? そして、私のコードは少し粗末なので、他の方法でそれを行うことができる方法を誰かが提案できます.そして、カンマ区切りのステートメントは2番目のwhileループでどのように機能しますか??? コンパイラがこれらのステートメントをどのように処理するかは、特別な場合があります。

4

1 に答える 1

0

2D 参照を効果的に行うための他の方法をリストアップできる人はいますか?

最も簡単なことは、ポインタ演算の演習を*(*(s+i)+j)より慣習的なものに置き換えることですs[i][j]:

for(i=0;i<L;i++) {
    for(j=0;j<W;j++) {
        len++;
        printf("%d ", s[i][j]); <<== Here
    }
    printf("\n");
}

ideone でのこの変更のデモでは、元のプログラムと同じ出力が生成されます (こちら)。

また、カンマ区切りのステートメントは 2 番目の while ループでどのように機能しますか?

コンマは標準の C 演算子です。これはシーケンス ポイントとして機能します。

可変サイズ int の配列を渡すことstring_lengthができるようにするには、次のように配列の構造をポインターの配列に変更します。

int string_length(int **s,int L,int W) {
    ... // This code does not change from the above
}
int *str[5]={
    (int[]){2,1,3,1,1,1,1,1,1,1},
    (int[]){2,1,3,1,1,1,1,1,1,1},
    (int[]){2,1,3,1,1,1,1,1,1,1},
    (int[]){2,1,3,1,1,1,1,1,1,1},
    (int[]){2,1,3,1,1,1,1,1,1,1}
};
printf("the result is %d \n",string_length(str, 5, 10));    

この選択の結果の 1 つは、行サイズ変更マクロが機能しなくなることです (デモはこちらをご覧ください)。ただし、配列サイズ変更マクロ (つまり、行数を決定するマクロ) は引き続き機能します。NULLもう 1 つの結果は、残りの項目がポインターに設定されて印刷ループが壊れるため、イニシャライザーに入れているよりも多くの項目を宣言できなくなることです。

于 2013-08-09T16:30:50.320 に答える