を必要とするファイルからデータをロードするクラスがありますがchar* fileName
、この方法でそれを使用する方法について明確に理解していません。
// Constructor
Foo(char* fileName)
char
a は 1 文字しか使用できないことは理解していますが、これの使用方法について誰かが明確にすることはできますか?
Achar*
は「へのポインタchar
」です。つまり、char
オブジェクトのアドレスを保持します。配列の最初の要素を指すポインターを使用することは非常に一般的です。つまり、アドレスを 1 増やすと、配列内の次の要素のアドレスが取得されます。
┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐
│ │ │ │ │ │ │ │ │ │
└─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┘
^
└─ pointer to first element of an array
C スタイルの文字列は通常、 の配列に格納されますchar
。たとえば、ここでは文字列"filename.txt"
を次の配列に格納していchar
ます。
char str[] = "filename.txt";
配列の名前は、最初の要素を指すポインターに暗黙的に変換できます。つまり、文字str
へのポインターであるかのように使用できます。f
そのポインターの型はchar*
です。
char*
これが、変数を C スタイルの文字列と見なすことが多い理由です。これは実際には単なるポインタですが、通常はchar
配列の最初を指していると想定されています。また、配列はほとんどの場合、null で終わると想定されます。つまり、文字列の末尾を示すchar
with 値があることを意味します。0
文字列はメモリ内で次のようになります。
┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐
│ f │ i │ l │ e │ n │ a │ m │ e │ . │ t │ x │ t │\0 │
└───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┘
したがって、配列からポインターへの変換により、次のstr
ように配列をコンストラクターに渡すことができます。
Foo foo(str);
ただし、文字列リテラルをコンストラクターに直接渡すことは、C++03 では推奨されておらず、C++11 では完全に無効であることに注意してください。あなたはこれを行うことはできません:
Foo foo("filename.txt");
これに関する問題は、この文字列リテラルの型が「13 の配列const
char
」であることです。ポインタに変換した後はconst char*
. 正確性に違反するため、パラメータconst char*
にa を渡すことはできません。char*
const
歴史的に、C の作成者は、配列を渡すことができる場所にポインターを渡すことができ、その逆も可能であると考えてきました。
コンセプトを少し考えれば、それらは密接に関連しています。ポインタは、メモリの多くの部分を参照できます(メモリのバイトが上下に並んでいる配列を含む)。
配列ではなくポインターを使用し、++ および -- 演算子 (ポインター演算と呼ばれるもの) を使用すると、インデックス値を使用して配列内を移動するのと同じように、メモリ内を移動できます。
C 文字列の標準は、文字列の終わりを区切る最後の '\0' 文字を持つことです。この端までポインターを移動すると、文字列配列全体が得られます。
Achar*
は文字へのポインタです。ファイル名は文字の配列にすることができますchar fileName[12] = "myFile.txt";
[ string
etc は別として] この場合、char*
この配列の最初の文字を指すためにポインターが使用されます。これを印刷する必要がある場合、コンパイラはポインター [ka base address] によって指定されたアドレスを取得し、そのアドレスを取得して各文字を印刷し続けます。a のアドレスはchar
、ベースアドレスに添字を追加することによって得られます。\n
だからあなたは利用することができます
char* fileName = "myFile.txt"; or char fileName[11] = "myFile.txt";
Foo(fileName);
または Foo("myFile.txt");