1

次のように定義されたテーブル構造があります。

typedef struct table {
char *key;
void *value;

} Table;

次に、次のようなものがあります。

Table **table

変数として。

どういう意味ですか?

テーブルの配列?

テーブル ポインターを指すテーブル ポインター?

4

3 に答える 3

2

ポインターのポインターにはさまざまな用途があります。通常使用する 1 つの例は、main()それ自体の宣言です。

int main(int argc, char** argv) {

これは何を意味するのでしょうか?

ご存知のように、argv実行時にプログラムで使用されたパラメーターが表示されます。各パラメータは文字列であり、おそらくご存じのとおり、文字列は の配列でもありcharます。

ただし、は1 つの文字列だけを表すわけではないargvため、文字の配列ではありません。配列の配列です。1 つのストリングではなく、多くのストリングをもたらすことができます。argvargv

の各要素argvは、可能な多くのパラメータの 1 つであるchar*の配列です。char

の表現は次のargvように記述できます。

char** argv = {
    (char*)"Param 0",
    (char*)"Param 1",
    (char*)"Param 2",
    ...
};

ポインターへのポインターの他の可能な用途は、パラメーターとして関数に渡すときに値を割り当てる場合です。

intたとえば、次のようにポインタを使用してa に数値を代入するのと同じ方法:

void assign_random_to(int* result) {
    *result = rand();
}

int i = 0;
assign_random_to(&i);
// i is now the value of rand()

ポインターでも同じことができます。上記と同じ意味で、ポインターへのポインター、ポインターへのポインターが必要になります。

int try_malloc(void** ptr, int size) {
   void* tmp = malloc(size);
   if (tmp == NULL)
       return 0;

   *ptr = tmp;
   return 1;
}

char small_buffer[128];
char* buffer = small_buffer;
if (try_malloc(&buffer, 1024))
{
    strcpy(buffer, "Big buffer was successfully allocated!");
}
else
{
    printf("Failed to alloc a big buffer, original pointer to small buffer preserved.");
}

あなたのコメントに答えてください。

パラメータに値を単純に割り当てることはできないためです。

void assign_value_to_parameter(int param) {
    param = 2;
    // param is now 2, but only in this context
}

int x = 1;
assign_value_to_parameter(x);
// x is still 1, the function did not change its value in this context

関数assign_value_to_parameter()が値を変更したという事実paramは、元の変数の値には影響しません。そのため、関数に値を変更する手段を与えるために、何かへのポインターを渡す必要があります。ターゲットが既にポインターである場合は、このポインターにポインターを渡す必要があります。

于 2013-10-27T00:01:30.503 に答える
0

通常、ポインターの配列を動的に割り当てる場合、二重ポインターが表示されます。各構造体が個別に割り当てられた場合、すべてのポインターを保持するために配列 (または他のデータ構造) が必要になります。ポインターの配列を作成すると、(n 個の配列の) ポインターへのポインターが得られます。

于 2013-10-27T00:01:10.713 に答える