[解決済み] const char * を使用する場合と const char [] を使用する場合について
質問
この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
ポインタ/配列)
解決方法は?
まず、両者は明確に異なっています。
- Firstはポインターを作成します。
- 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が発生する可能性があるからです。
関連
-
[解決済み】Visual Studio 2015で「非標準の構文; '&'を使用してメンバーへのポインターを作成します」エラー
-
[解決済み] [Solved] Error C1083: Cannot open include file: 'stdafx.h'
-
[解決済み】エラー:strcpyがこのスコープで宣言されていない
-
[解決済み] std::string を const char* または char* に変換する方法
-
[解決済み] SQLiteのINSERT/per-secondのパフォーマンスを向上させる
-
[解決済み] 1ビットのセット、クリア、トグルはどのように行うのですか?
-
[解決済み] static_cast, dynamic_cast, const_cast, reinterpret_cast はいつ使うべきですか?
-
[解決済み] スマートポインターとは何ですか?
-
[解決済み] 仮想デストラクタはいつ使うのか?
-
[解決済み] const int*、const int * const、int const *の違いは何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】C++ クラスヘッダが含まれているときに「不明な型」があるのはなぜですか?重複
-
[解決済み】Visual Studio 2015で「非標準の構文。'&'を使用してメンバーへのポインターを作成します」エラー
-
[解決済み】変数 '' を抽象型 '' と宣言できない。
-
[解決済み】Cygwin Make bash コマンドが見つかりません。
-
[解決済み】デバッグアサーションに失敗しました。C++のベクトル添え字が範囲外
-
[解決済み】fpermissiveフラグは何をするのですか?
-
[解決済み] [Solved] インクルードファイルが開けません。'stdio.h' - Visual Studio Community 2017 - C++ Error
-
[解決済み】システムが指定されたファイルを見つけられませんでした。
-
[解決済み】演算子のオーバーロード C++; <<操作のパラメータが多すぎる
-
[解決済み】エラー。引数リストに一致するコンストラクタのインスタンスがない