次のように定義されたテーブル構造があります。
typedef struct table {
char *key;
void *value;
} Table;
次に、次のようなものがあります。
Table **table
変数として。
どういう意味ですか?
テーブルの配列?
テーブル ポインターを指すテーブル ポインター?
ポインターのポインターにはさまざまな用途があります。通常使用する 1 つの例は、main()
それ自体の宣言です。
int main(int argc, char** argv) {
これは何を意味するのでしょうか?
ご存知のように、argv
実行時にプログラムで使用されたパラメーターが表示されます。各パラメータは文字列であり、おそらくご存じのとおり、文字列は の配列でもありchar
ます。
ただし、は1 つの文字列だけを表すわけではないargv
ため、文字の配列ではありません。配列の配列です。1 つのストリングではなく、多くのストリングをもたらすことができます。argv
argv
の各要素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
は、元の変数の値には影響しません。そのため、関数に値を変更する手段を与えるために、何かへのポインターを渡す必要があります。ターゲットが既にポインターである場合は、このポインターにポインターを渡す必要があります。
通常、ポインターの配列を動的に割り当てる場合、二重ポインターが表示されます。各構造体が個別に割り当てられた場合、すべてのポインターを保持するために配列 (または他のデータ構造) が必要になります。ポインターの配列を作成すると、(n 個の配列の) ポインターへのポインターが得られます。