(免責事項: この回答は C++ のみを対象としています。C と C++ の両方を尋ねることはお勧めしません。両方の言語はまったく異なるためです)
プロローグ
char *k ;
文字へのポインタを宣言します。
"ddddd"
この式は type char const[6]
、つまり 6 つの定数文字の配列です。この型の式は、配列の最初の要素へのポインターに暗黙的に変換できます。そのポインタの型は ですchar const*
。つまり、定数文字へのポインタです。Aは、それが指す文字の変更を許可するため、 にchar const*
変換できませんが、変更はできません。char*
char*
char const*
char *d="ddddd";
上記の規則により、この記述は正しくありません。コンパイラで警告をオンにする必要があります。これに対して警告が表示されます (理想的には、単なる警告ではなく、実際にはエラーになります)。char const* d = "ddddd";
本当にポインターが必要なchar d[] = "ddddd";
場合、または配列が必要な場合は、そうする必要があります。const
2 番目の形式はコピーを作成するため不要であり、元のデータを変更するリスクはありませんconst
。
*d
char const*
この式には、前述のへの暗黙的な変換が含まれており、次に間接演算子 ( the *
) が適用されて、 type の式char const&
、つまり定数文字への参照が生成されます。
*k
と同様に*d
、これはポインタに対して間接化を実行します。この場合、k
は typechar*
であるため、結果の式は type になりchar&
ます。
*k=*d; //expecting to copy "ddddd" to *k
割り当ては、定数文字への参照から文字への参照への割り当てであるため、単一の文字を割り当てます。文字列の最初の文字を が指す文字に割り当てることになります。これは... 待ちます。k
どこk
を指す?初期化されていませんでした!これは悲劇に終わるにちがいない。
第1章
では、どうすればk
どこかを指し示すことができるのでしょうか? d
そして、文字列全体をそのスペースにコピーするにはどうすればよいでしょうか?
d
配列の 6 文字を にコピーするには、6 文字分のk
スペースが必要です。これを行う最も簡単な方法は、6 文字の配列を作成することです。
char k[6];
では、六つの要素をどのようにコピーするのでしょうか? strcpy
null で終わる文字列をコピーする C ライブラリ関数 を使用できます。この関数を使用するには、次の理由から注意が必要です。
'\0'
ソースには、末尾を示すヌル ( ) 文字が必要です。ソースにそのような文字が含まれていない場合、動作は未定義であり、何かが起こる可能性があります。これが、文字列"ddddd"
が 5 文字ではなく 6 文字である理由\0
です。末尾に、コンパイラが挿入する暗黙の文字があります。
null ターミネータを含むソース文字列全体に十分なスペースが宛先に必要です。宛先に十分なスペースがない場合、動作も未定義であり、何かが起こる可能性があります。
これは、この関数を使用して文字列のコピーを作成する方法です。
std::strcpy(k, d);
ポイント 1 または 2 のいずれかを満たさないと、一見動作しているように見えるプログラム (運が悪い場合) から、奇妙な方法でランダムに動作するもの、単純にクラッシュする (運が良ければ) まで、あらゆる結果が生じる可能性があります。
エピローグ
男、それは多くの情報でした。C++ プログラマーは、これらの問題を常に気にする必要がありますか? それは疲れるに違いない。
C++ プログラマーstd::string
は文字配列の代わりに使用することができ、これで手間が大幅に軽減されます。代入演算子を使用してコピーを作成でき、正しいサイズを追跡する必要がなく、null を持つことを気にする必要もありません。ターミネータを配置すると、コンパイル時にサイズを制限する必要がなくなり、その他にも多くの利点があります。
std::string k;
void ffill()
{
std::string d="ddddd";
k = d;
cout<<k<<"\n";
d[1]=5;
cout<<k<<"\n";
}