あなたは実際にはcharのベクトルであるC文字列について話している。C++ では、クラスstd::string
が使用され、定数文字列が として作成されconst std::string
ます。
とにかく、コンパイラは、ソースコードに表示されるリテラル文字列を格納するために、将来のプログラムでメモリの一部を予約します。メモリのこの部分は読み取り専用と見なされるため、const char *
. サイズは、文字列のサイズに、末尾のゼロの位置を 1 つ加えた正確なサイズであり、文字列の終わりを示します。
コンパイラは下位互換性を維持する必要があるため、 が指すリテラルを引き続き受け入れますchar *
。ただし、組み込みシステムの ROM に格納できるメモリを変更できるとは想定されていないため、これは誤解を招く可能性があります。
私のシステムでは、clang を使用しています。
$ clang --version
Ubuntu clang version 3.0-6ubuntu3 (tags/RELEASE_30/final) (based on LLVM 3.0)
Target: i386-pc-linux-gnu
Thread model: posix
clang C コンパイラでは、このコードはエラーなしでコンパイルされます。
#include <stdio.h>
#include <stdlib.h>
int main()
{
char * str = "Hello, World!";
printf( "%s", str );
return EXIT_SUCCESS;
}
ただし、まったく同じコード (ヘッダーの名前などの小さな変更を加えたもの) を C++ プログラムとしてコンパイルすると、次の警告がスローされます。
kk.cpp:6:15: warning: conversion from string literal to 'char *' is deprecated [-Wdeprecated-writable-strings]
char * str = "Hello, World!";
^
1 warning generated.
お役に立てれば。