1. ホーム
  2. c++

[解決済み] char*とは何ですか?

2022-03-02 22:42:07

質問

そこで、ある大学のC++に関する講義を見て、いろいろと勉強しているのですが、ひとつだけ、まだ理解できないことがあります。

なぜ時々こんなことをしなければならないのですか?

char* test = "testing";

私が読んだり見たりした限りでは、どうして * . 私が理解しているつもりだったところでは、あなたが使用するのは * というのも、このサイトでは、「アドレスがある場合」のみを対象としています。

解決するには?

これは char :

char c = 't';

のみを保持することができます。 char アクター


これはC文字列です。

char s[] = "test";

を保持することができます。 複数 char アクターがあります。上記を別の書き方で言うと

char s[] = {'t', 'e', 's', 't', 0};

0 と呼ばれ、最後に NUL の終端記号です。C文字列の終端を表す。


A char* は、C文字列の開始メモリ位置を格納する。 1 例えば、同じ配列を参照するのに使える s で、上で定義した これを行うには char* のメモリ位置へ移動します。 最初 要素の s :

char* p = &(s[0]);

& 演算子によって s[0] . 以下は、上記を短くした書き方です。

char* p = s;

お知らせ

*(p + 0) == 't'
*(p + 1) == 'e'
*(p + 2) == 's'
*(p + 3) == 't'
*(p + 4) == 0  // NUL

あるいは、その代わりに

p[0] == 't'
p[1] == 'e'
p[2] == 's'
p[3] == 't'
p[4] == 0  // NUL


もう一つの一般的な使用法は char* は文字列のメモリ上の位置を参照するものです。 リテラル :

const char* myStringLiteral = "test";

警告 この文字列リテラルは、実行時に変更してはいけません。私たちは const を変更しないようにプログラマ (およびコンパイラ) に警告するためです。 myStringLiteral を以下のような不正な方法で使用する。

myStringLiteral[0] = 'b';  // Illegal! Do not do this for const char*!

とは異なり、配列 s 上記のように、私たちが を変更することが許可されています。これは、文字列リテラル "test" は初期化時に自動的に配列にコピーされます。しかし myStringLiteral このようなコピーは発生しません。(どこにコピーするのでしょうか?データを格納する配列もない。 char* !)


1 テクニカルノート char* は、単にメモリロケーションを char . 確かに、1つの char . しかし、より一般的なのは char* は、C文字列を参照するために NUL -で終端する文字列です。