argv[1]
型のポインタですchar*
。その値はアドレスであり、文字列ではありません。具体的には、その値は、値が であるchar
オブジェクトのアドレスです't'
。
C 標準 (セクション 7.1.1) には、次の定義があります。
文字列は、最初の null 文字で終了し、最初の null 文字を含む連続した一連の文字です。
[...]文字列へ
のポインターは、最初の (アドレス指定が最も低い) 文字へのポインターです。文字列の長さはヌル文字の前のバイト数であり、文字列の値は含まれている文字の値のシーケンスです。
連続する文字シーケンスの最初の文字を指しているためargv[1]
、そのうちの 1 つがヌル文字であるため、文字列へのポインタです。その文字列の値は "test" (終端の を含む'\0'
) で、文字列の長さは 4 です。
の値が であると、一種の口頭で簡略化して言うのが一般的ですargv[1]
が"test"
、それは不正確です -- *es
argv[1]
また、文字配列の最初の文字を指します。その配列の最初の 5 バイトには文字列が含まれます"test"
。配列全体に文字値が含まれています。
{ 't', 'e', 's', 't',
'\0',
'e', 'x', 'a', 'm', 'p', 'l', 'e',
'\0' }
の値をargv[1]
文字列関数に渡すと、その関数は のみを参照"test"
し、終端の を超えるものにはアクセスしません'\0'
。memcpy
配列の残りの内容はまだ完全に有効であり、文字列を操作するだけではない関数 ( など) を使用してアクセスできます。
一種の口頭での省略形として、 の値はargv[1]
is"test"
であると言うのが一般的ですが、それは不正確です。特に、文字列の値とその文字列を含む配列の値の違いが重要なこのような場合には。
これらの特定の内容を持つ配列の最初の要素を指すような方法でメイン プログラムを呼び出すことができるかどうかargv[1]
は、オペレーティング システムに依存する別の問題です。