6

私はCを学び始め、次のコードを読み始めています:

public void** list_to_array(List* thiz){
    int size = list_size(thiz);
    void **array = malloc2(sizeof(void *) * size);
    int i=0;
    list_rewind(thiz);
    for(i=0; i<size; i++){
        array[i] = list_next(thiz);
    }
    list_rewind(thiz);
    return array;
}

の意味がわかりませんvoid**。誰かがいくつかの例でそれを説明できますか?

4

4 に答える 4

4

void** は void (未指定型) へのポインタへのポインタです。これは、変数 (メモリ位置) が別のメモリ位置へのアドレスを含むメモリ位置へのアドレスを含み、そこに格納されるものは指定されていないことを意味します。この質問の場合、それは void* ポインターの配列へのポインターです。

補足: void ポインターは逆参照できませんが、void** は逆参照できます。

void *a[100];
void **aa = a;

これを行うことで、たとえば aa[17] を実行して、配列 a の 18 番目の要素を取得できるはずです。

このような宣言を理解するには、このツールを使用できます。また、関連する質問を 1 つまたは2 つ確認することもできます。

于 2012-07-12T19:59:23.257 に答える
1

void**へのポインタvoid*、または必要に応じてapointerへのポインタです。この表記法は、たとえば行列を実装するためvoid pointerに伝統的に使用されています。Cしたがって、行列の場合、それは apointerから an になりarray of pointersます。

于 2012-07-12T01:54:00.160 に答える
0

通常void *、ポインターは、不明なデータ型へのポインターを示すために使用されます。この場合、関数はそのようなポインターの配列を返すため、二重星になります。

C では、配列を参照するためにポインターがよく使用されます。たとえば、次の割り当ては完全に合法です。

char str1[10];
char *str2 = str1;

void を使用すると、char の代わりに未知の型の変数があることを意味します。

不明なデータ型へのポインターは、一般的なアルゴリズムを記述するのに役立ちます。例えば。標準 C ライブラリの qsort 関数は次のように定義されています。

void qsort ( void * base, 
             size_t num, 
             size_t size, 
             int ( * comparator ) 
             ( const void *, const void * ) );

ソート アルゴリズム自体は一般的なものですが、データの内容についての知識はありません。したがって、ユーザーはそれを処理できるコンパレーターの実装を提供する必要があります。アルゴリズムは、比較する要素への 2 つのポインターを使用してコンパレーターを呼び出します。void *ソートされるデータのタイプに関する情報があるため、これらのポインタはタイプです。

他の例については、このスレッドをご覧 ください http://forums.fedoraforum.org/showthread.php?t=138213

于 2012-07-12T01:59:04.287 に答える
0

void ポインターは、任意のデータ型のアドレスを保持するために使用されます。void**void ポインタへのポインタを意味します。void ポインターは、関数が関数の引数としてさまざまな型のデータを受け取る必要がある場所で使用されます。以下の例を確認してください

void func_for_int(void *int_arg)
{
    int *ptr = (int *)int_arg;
    //some code
}

void func_for_char(void *char_arg)
{
    char *ptr = (char *)char_arg;
    //some code
}

int common_func(void * arg, void (*func)(void *arg))
{
    func(arg);
}

int main()
{
    int a = 10;
    char b = 5;

    common_func((void *)&a, func_for_int);
    common_func((void *)&b, func_for_char);

    return 0;
}
于 2012-07-29T07:57:20.897 に答える