3
const char *pt1="123";
const char *pt2={'1', '2', '3', '\0'};

それは同じですか?後者はコンパイルに失敗します。

エラー: スカラー オブジェクト 'pt2' には初期化子に 1 つの要素が必要です

なんで?"123"と同じではありません{'1', '2', '3', '\0'}か?

delete[] pt1リソースを解放するために使用できますdelete pt1か?

4

4 に答える 4

9

いいえ、それらは同じではありません。1 つ目は文字列リテラル、2 つ目は type の要素を持つ初期化子リストcharです。

次のような 2 番目の構文を使用できます。

const char pt2[]={'1', '2', '3', '\0'};

しかし、この場合でも、それらは同じではありません:

const char *pt1="123";

この場合"123"、読み取り専用メモリに格納されます。pt1それを指すだけです。

const char pt2[]={'1', '2', '3', '\0'};

ただし、この場合、すべての要素が pt2 にコピーされます。

delete [] pt1 を使用してリソースを解放するか、単に pt を削除できますか?

いいえ、できません

(もちろん可能ですが、やるべきではありません)

于 2013-05-29T07:37:19.030 に答える
4

C++ でそれを行う方法はありません。いいえ、集約初期化子を使用しようとする試みは、文字列リテラルと同じではありません。集計初期化子 like{'1', '2', '3', '\0'}は配列を導入しません。

補足として、C 言語で非文字列リテラルを介して配列オブジェクトを実装するには、次の構文を使用して複合リテラルと呼ばれる C99 機能を使用する必要があります。

const char *pt2 = (const char []) {'1', '2', '3', '\0'};

これは、文字列リテラルで得られるものとほとんど同じです。ただし、違いが 1 つあります。文字列リテラルには常に静的な保存期間がありますが、ローカルで使用される複合リテラルには自動保存期間があります。

于 2013-05-29T07:43:06.663 に答える