1

これらの状況でポインターはどのくらいインクリメントされますか?またその理由は?

void f(int a[])
{
    a++;
    printf("%d", *a);
}

void g(int a[][M])
{
    a++;
    printf("%d", *a[0]);
}

n 個の要素をmain持つ静的に割り当てられた配列と、 n行とM列を持つ静的に割り当てられた行列 ( 2D 配列) があり、関数fgを呼び出しているとしましょ(多くのコードとほとんどテキストなしで質問を投稿してください)。

4

1 に答える 1

3

どちらの場合も、ポインタは 1 回だけインクリメントされます。:)

a++;

それらの値は、それらが指すオブジェクトの型の sizeof によって変更されます。したがって、最初のポインターの値は によって変更されsizeof( int )、2 番目のポインターの値は によって変更されsizeof( int[M] ) ます。int a[][M]int ( *a )[M]

したがって、関数内では、両方のポインターが配列の 2 番目の要素を指します。2 次元配列の場合、その要素は 1 次元配列です。そしてこの発言

printf("%d", *a[0]);

2 次元配列の 2 番目の「行」の最初の要素 (整数) を出力します。

于 2015-05-13T20:13:58.910 に答える