9

それで、ポインターについて読んでいて、配列へのポインターの概念に出くわしました。問題は、配列要素にアクセスするためのオフセットを持つポインターを使用する代わりに、要素を直接取得できるため、配列へのポインターは実際にはまったく役に立たないように見えることです。しかし、これらが役立つ理由を見逃しているように感じます。

つまり、要するに、配列へのポインターのポイントは何ですか。それらはどのように、そしてなぜ使用されるべきであり、実用的なアプリケーションがありますか?

編集:これは、次のような通常/単純な配列のコンテキストで意味していました。

int array[5];

編集:キースが指摘したように、配列へのポインターについて具体的に尋ねています。たとえばchar (*ptr)[42]、charの42要素配列へのポインターです。

4

6 に答える 6

11

残念ながら、あなたが受け取ったいくつかの回答は、C のポインタと配列についての誤解を簡単に示しています。

1) 配列へのポインタが最初の要素へのポインタと同じではありません。

2) 配列型の宣言は、ポインターの宣言と同じではありません。

ポインターと配列の間の一般的な混同に関連する C faq の部分で完全な説明を見つけることができます: http://c-faq.com/aryptr/index.html

あなたの質問に対処する - 配列へのポインターは、コンパイル時に既知のサイズの配列全体を渡し、引数の受け渡し中にそのサイズに関する情報を保持するのに役立ちます。ある配列の部分配列を操作するときに、多次元配列を扱う場合にも役立ちます。

于 2013-10-05T16:57:03.790 に答える
7

ほとんどの式では、「T の配列」型のオブジェクトは、「T へのポインタ」型を持つ最初の配列要素のアドレスに分解されます。この意味で、ポインター型を使用してアイテムの配列を表すことができ、配列を動的に割り当てる必要がある場合に使用されます。

// ptr used to dynamically allocate array [n] of T
T *ptr = malloc(n * sizeof(*ptr));

配列へのポインタの場合、それを使用して配列の配列を表したり、配列の配列を動的に割り当てたりすることができます。したがって、配列へのポインタを使用して 2 次元配列を表すことができます。

// ptr used to dynamically allocate 2 dimensional array [n][10] of T
T (*ptr)[10] = malloc(n * sizeof(*ptr));
于 2013-10-05T16:33:39.967 に答える
5

配列への真のポインター (これまで実際には対処されていません) は、ほとんどのコンテキストで配列が最初の要素へのポインターに減衰するため、一般的ではありません。また、配列型を割り当てることができないため、他のポインター型に比べて実用的ではありません。その点では、関数ポインタに似ています。

実際の最大の違いは、関数の呼び出しや戻りなど、ポインターの減衰によって配列が失われる状況で、配列のサイズが保持されるという事実から生じます。たとえば、次のコードを見てください

void function(char (*array)[10]) {
    for(size_t i = 0; i < sizeof(*a); i++);
        (*a)[i] = i;
}
...
char a[10];
function(&a);

この sizeof の適用を可能にするだけでなく (サイズはパラメーターの一部として知られているため、これはあまり役に立ちません)、これにより、渡す引数の正確なサイズが型の一部として強制さfunction(char array[10])[static 10]ます。戻るには、通常とは異なる構文があります。

char (*function(void))[10] {
    static char array[10];
    // do something with our static array
    return &array;
}
char (*a)[10] = function();
// or even
char (*b)[sizeof(*function())] = function();

私は実際にこのアプリケーションに出くわしたことはないと思いますが、少なくとも可能です (そして合法です)。

于 2013-10-06T06:55:42.687 に答える
-1

現時点で考えられるのは (他にもあると思います)ですがyou want to make multidimensional array現時点では、配列の 2 次元または 3 次元に保存するデータがありません。配列の 2 次元と 3 次元のスペースを節約してメモリを無駄にしたくありませんが、格納するデータがあるときに後でメモリを割り当てる予定です。そのときは、配列へのポインタが便利です。

例えば。

for (int i=0; i<10; i++)
   (*x)[i] = malloc(N * sizeof(*x));


   // take input or put data in the array

C での 2 次元配列の表現:

こちらのサイトがとても分かりやすく説明してくれています。これは、混乱を取り除くのに役立ちます。

于 2013-10-05T16:28:26.423 に答える