を使ったプログラムを考えてみましょう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)
次の文字列 (の最初の文字) を指します。