を使ったプログラムを考えてみましょうargc == 3。
argv
|
v
+---------+ +----------------+
| argv[0] |-------->| program name\0 |
+---------+ +-------------+--+
| argv[1] |-------->| argument1\0 |
+---------+ +-------------+
| argv[2] |-------->| argument2\0 |
+---------+ +-------------+
| 0 |
+---------+
変数argvは、ポインターの配列の先頭を指します。 argv[0]最初のポインターです。プログラム名を指します (または、システムがプログラム名を判別できない場合、文字列 forargv[0]は空の文字列になります; argv[0][0] == '\0')。 argv[1]は最初の引数をargv[2]指し、2 番目の引数を指し、argv[3] == 0(同等にargv[argc] == 0) を指します。
もちろん、知っておく必要があるその他の詳細は、array[i] == *(array + i)任意の配列に関するものです。
あなたは具体的に尋ねます:
- **argv が文字列全体ではなく最初の文字を指すのはなぜですか?
*argvは に相当し*(argv + 0)、したがってargv[0]. ですchar *。a を逆参照するchar *と、文字列の「最初の」文字が取得されます。したがって、 andはまたはまたは**argvと同等です。*(argv[0])*(argv[0] + 0)argv[0][0]
(これはポインターではなく文字であると正当に主張できる**argvため、「最初の文字を指す」わけではありません。単に of の別の名前です'p'。"program name\0")
- 同様に、なぜ *argv[0] は前の例と同じものを指すのでしょうか。
前に述べたように、argv[0]は文字列へのポインタです。したがって*argv[0]、文字列の最初の文字にする必要があります。
*argv前の例のように最初の文字ではなく、最初の文字列全体を指すのはなぜですか?
これは慣例の問題です。 *argv最初の文字列の最初の文字を指します。文字列へのポインターとして解釈すると、「文字列全体」を指すのと同じように、「char *pqr = "Hello world\n";文字列全体」を指します。これを単一の文字へのポインタとして解釈すると、文字列の最初の文字を指します。波動と粒子の二重性と考えてください。ここだけ文字列の二重性です。
*argv + 1配列内の次の文字列を指すのではなく、「最初の文字を引いた」文字列を指すのはなぜですか?
*argv + 1です(*argv) + 1。すでに説明したように*argv、 は最初の文字列の最初の文字を指します。ポインターに 1 を追加すると、次の項目を指します。*argv文字を指すので、次の文字を指し*argv+1ます。
*(argv + 1)次の文字列 (の最初の文字) を指します。