2

を必要とするファイルからデータをロードするクラスがありますがchar* fileName、この方法でそれを使用する方法について明確に理解していません。

// Constructor
Foo(char* fileName)

chara は 1 文字しか使用できないことは理解していますが、これの使用方法について誰かが明確にすることはできますか?

4

3 に答える 3

3

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 で終わると想定されます。つまり、文字列の末尾を示すcharwith 値があることを意味します。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

于 2013-04-08T12:25:24.850 に答える
0

歴史的に、C の作成者は、配列を渡すことができる場所にポインターを渡すことができ、その逆も可能であると考えてきました。

コンセプトを少し考えれば、それらは密接に関連しています。ポインタは、メモリの多くの部分を参照できます(メモリのバイトが上下に並んでいる配列を含む)。

配列ではなくポインターを使用し、++ および -- 演算子 (ポインター演算と呼ばれるもの) を使用すると、インデックス値を使用して配列内を移動するのと同じように、メモリ内を移動できます。

C 文字列の標準は、文字列の終わりを区切る最後の '\0' 文字を持つことです。この端までポインターを移動すると、文字列配列全体が得られます。

于 2013-04-08T12:24:08.710 に答える
0

Achar*は文字へのポインタです。ファイル名は文字の配列にすることができますchar fileName[12] = "myFile.txt";[ stringetc は別として] この場合、char*この配列の最初の文字を指すためにポインターが使用されます。これを印刷する必要がある場合、コンパイラはポインター [ka base address] によって指定されたアドレスを取得し、そのアドレスを取得して各文字を印刷し続けます。a のアドレスはchar、ベースアドレスに添字を追加することによって得られます。\n

だからあなたは利用することができます

char* fileName = "myFile.txt"; or char fileName[11] = "myFile.txt";
Foo(fileName);

または Foo("myFile.txt");

于 2013-04-08T12:27:43.733 に答える