1. ホーム
  2. c++

[解決済み] const char * を使用する場合と const char [] を使用する場合について

2022-03-10 16:14:19

質問

この2つが違うことは知っていますし、どのように違うのかも知っていますし、それに関する質問はすべて読みました。 char*char[]

しかし、これらの答えは、どのような場合に使うべきかを教えてはくれません。

そこで質問です。

をどのような時に使うのですか?

const char *text = "text";

を、どのような場合に使用するのでしょうか?

const char text[] = "text";

何かガイドラインやルールがあるのでしょうか?

例として、どちらが良いのか。

void withPointer()
{
    const char *sz = "hello";
    std::cout << sz << std::endl;
}

void withArray()
{
    const char sz[] = "hello";
    std::cout << sz << std::endl;
}

(私が知っているのは std::string も選択肢の一つですが、特に知りたいのは char ポインタ/配列)

解決方法は?

まず、両者は明確に異なっています。

  1. Firstはポインターを作成します。
  2. 2番目は配列を作成します。

より詳しい説明はこちらをご覧ください。

Arrayバージョンです。

char text[] = "text"; 

文字列リテラル "text"を格納するのに十分な大きさの配列を作成し、その配列には NULL の終端記号です。配列 text は文字列リテラル "text"で初期化されます。 この配列は後で変更することができます . また、コンパイル時にも配列のサイズは分かっているので sizeof 演算子を使ってサイズを決定することができます。


ポインター版です。

char *text  = "text"; 

文字列リテラル "text" を指し示すポインタを作成します。これは、配列バージョンよりも高速です。 しかし、ポインタの指す文字列は変更してはいけません。 これは、読み取り専用の実装定義メモリに配置されるからです。このような文字列リテラルを変更すると 未定義の動作 .

実際、C++03 では、文字列リテラルに const キーワードを使用します。だから、宣言はこうでなければならない。

const char*text = "text";

また、あなたは を使用する必要があります。 strlen() 関数ではなく sizeof 文字列の大きさを求めるために というのは sizeof 演算子は、ポインタ変数のサイズを与えるだけです。


どのバージョンが良いですか?

使用方法によって異なります。

  • 文字列を変更する必要がない場合は、ポインタ版を使用します。
  • データを変更する予定がある場合は、配列版を使用します。

EDIT: OPが違いを求めていることに(コメントで)気づきました。

const char text[]const char* text

さて、文字列リテラルの変更に関する点を除けば、上記の異なる点はそのまま当てはまります。この場合 const 修飾子によって、配列 test という型の要素を含む配列になります。 const char これは、それらが変更できないことを意味します。

なぜなら、ポインタは(間違って)簡単に別のポインタに付け替えられ、その別のポインタを通して文字列が変更され、UBが発生する可能性があるからです。