0

ポインターを使用して、2D 配列を 1D 配列として処理しようとしています (これが私の理解ではメモリ内にあるためです)。私はそれを持っていると思っていましたが、「a」のASCII値に追加しているだけであることがわかりました(そして、abcghidefjklの代わりにabcdefghijklを印刷しています)。

abcghidefjkl を出力するように printf ステートメントを書き直すにはどうすればよいですか? また、int と double を使用してそれを行うにはどうすればよいですか (つまり、data2 と data3 を使用)。

int main()
{

int i = 0;
char data[4][3] = { {'a','b','c'},{'g','h','i'},{'d','e','f'},{'j','k','l'}};
int data2[4][3] = { {1,2,3},{7,8,9},{4,5,6},{10,11,12}};
double data3[4][3] = { {1,2,3},{7,8,9},{4,5,6},{10,11,12}};

for(i=0;i<12;i++)
{
printf("%c\n", **(data)+i*sizeof(char));
}

return 0;
}

ありがとう!

4

2 に答える 2

0

はい、次の配列は実際にメモリの単一ブロック内に存在します。

char data[4][3] = { {'a','b','c'},{'g','h','i'},{'d','e','f'},{'j','k','l'}};

したがって、この配列の範囲内にある要素にアクセスしようとしている限り、好きなように扱うことができます。このような単純なポインター演算は次のようになります。

int i;
char* ptr = &data[0][0];
for(i = 0; i < 12; i++)
    printf("%c ", *(ptr + i));

それでも、これは出力されますa b c g h i d e f j k l。それを行うにa b c d e f g h i j k lは、おそらくより洗練されたものを用意する必要があります。たとえば、次のようになります。

int i,j;
char* ptr = &data[0][0];
// a b c d e f:
for(i = 0; i < 2; i++)
    for (j = 0; j < 3; ++j)
        printf("%c ", *(ptr + i*6 + j));
// g h i j k l:
for(i = 0; i < 2; i++)
    for (j = 0; j < 3; ++j)
        printf("%c ", *(ptr + i*6 + j + 3));

sizeof(char)常に を返すことが標準で保証されている1ため、省略できることに注意してください。s の配列の場合int、コードに必要な変更は 2つだけptrです。を使用する必要はありません。int*printf%dsizeof

于 2013-10-02T15:31:14.073 に答える