-1

char **に出くわしたとき、かなり混乱しましたが、文字列に対処する必要があるのでしょうか。
例えば:

double strtod(const char *nptr,char **endptr);

がNULLでない場合endptr、スキャンを停止した文字へのポインタは、が指す場所に格納されendptrます。---MSDN
これは非常に複雑ですが、文字へのポインタをコピーするだけではendptrどうでしょうか。endptr呼び出し後のすべての計算は、私が思うようにポインターの値をに渡すことによって実行できます。
本当にchar**必要ですか?

4

2 に答える 2

2

C の引数は値渡しです。関数に渡された引数に加えられた変更を関数の呼び出し元に見せたい場合は、関数に引数のアドレスを渡す必要があります。これがchar**が渡される理由です。呼び出し元は型の変数を持ち、char*そのアドレスを渡します。関数内で変更された場合、呼び出し元はその変更を確認できます。

例えば:

void set_int(int i) { i = 4; }

/* Caller */
int x = 7;
set_int(x);
/* 'x' is still 7 */

void really_set_int(int* i) { *i = 4; }

/* Caller */
int x = 7;
really_set_int(&x);
/* 'x' is now 4 */

type の変数についても同じ動作ですchar*。関数がchar*指すものchar*(内容ではない) を変更する必要がある場合は、タイプの のアドレスが必要char**です。

于 2012-10-27T07:07:39.243 に答える
0

という型があり、それを変更できるように a へのポインターを必要my_typeとする という関数があるとします。foo()my_type

void foo(my_type *t);

では、my_typeが実際にどのように定義されているかを見てみましょう。

typedef char* my_type;

したがって、型が既にポインターであるかどうかは問題ではありません。その型の変数にポインターを渡したい場合は、そのアドレスが必要です。したがって、次の分解:

my_type *t

だろう:

char **t

char *型の変数へのポインターが必要な場合はいつでも、 char **.

于 2012-10-27T07:11:46.963 に答える