文字配列とC文字列の違いは何ですか?


答え 1:

charの配列は、8ビットバイトとして解析される連続したメモリスパンです。作成時にサイズが固定され、すべてのバイトにcharを格納することが保証されています。

この場合の文字は、00000000(16進数で0x00)から11111111(16進数で0xFF)までの8ビットの2進数です。

文字配列[100]; / * 100文字の配列[0]から配列[99] * /

C文字列は、格納にchar配列を使用します。 C文字列は、0から配列の長さから1文字を引いた長さまでです。

整形式にするために、配列には、使用する文字セットの有効なシンボルを表すバイトのサブセットのみを含めることができます。 多くの場合、これはASCIIまたはUTF-8です。他のバイトは、文字列を印刷または解釈するときに有効でない場合があります。

文字列には、配列のアドレスを含む文字ポインター(char *)型のラベル(変数)があります。

文字列には、文字列の最後の文字の後に、文字列を終了するNULCHAR( '\ 0'、0x00 hex)があります。

char s [10]; char * t =&s; strncpy(t、 "012345678 \ 0"、10)

「イミディエート文字列」は、ソースコード内に二重引用符で記述され、文字が埋め込まれたchar配列が作成され、特別な文字列の読み取り専用メモリ位置に配置され、そのポインタが返されます。 これは、コンパイラによる「構文糖」であり、そのような文字列の使用を簡単にします。 NULCHARは配列に自動的に追加され、整形式の文字列になります。

char * s = "即時文字列"; printf( "%s \ n)、s);

すべての標準Cライブラリ文字列関数は、文字列をchar *として渡し、存在する「\ 0」に依存します。

かなり普遍的に使用される「ハック」は、アクセスされたときの配列のラベルが配列の最初の要素へのポインタとして機能することです。 およびその逆。

char * x = "abcdefgh"; printf( "x 4番目の文字:%c \ n"、x [3]); x 4番目の文字:d / *文字配列をchar配列に入れます* / char str [100]; strncpy(str、 "abcdefghijklmnop \ 0"、18); char * a = str; char * b = str + 7; printf( "%s \ n"、a); abcdefghijklmnop printf( "%s \ n"、b); hijklmnop

この柔軟性にもかかわらず、char配列とC文字列は直接互換性がありません。

char s [10]; s = "abcdefghi"; / *エラー* / //エラー:タイプ 'char *'からタイプ 'char [10]'に割り当てる場合の互換性のないタイプ sの割り当ては機能しません。char配列は割り当てられないためです。

配列は実際にはCの最初のクラス型ではありません。直接コピーすることはできず、配列レベルの操作などもありません。Cの配列で行われることはすべて、単位としてではなく個々のコンテンツで行われます。

char s [10]; char * x = "abcdefghi"; / *「\ 0」は末尾にあります* / strncpy(s、x、10); / *各文字を配列にコピーします* /

答え 2:

文字配列は、Cプログラミング言語のデータ構造、つまり文字を格納できるメモリ内のバイト数です。 これらの各セルには、任意の文字(つまり、8ビットのバイト、値0〜255)を格納できます。

Cスタイルの文字列(私はあなたの質問の「c文字列」を意味すると解釈する)は、文字の「文字列」を表す方法であり、C言語によってヌルバイト(値0)。 これは、文字自体にヌルバイトが続くことで表されるため、文字列の長さを個別に保存する必要はありません。 これとは対照的に、パスカルスタイルの文字列では、16ビットの符号なし整数とそれに続く情報バイト数で表されます(したがって、パスカル文字列の長さは最大65535です)。

したがって、文字配列はデータ構造であり、Cスタイルの文字列はデータ表現です。 彼らは別の獣です。

文字配列はCスタイルの文字列を保持することも、他の何かを保持することもできます(たとえば、ヌル文字の後に有用な情報が含まれているか、ヌル文字がまったく含まれていない)。 とにかく、少なくとも1つのヌル文字が含まれている限り、Cスタイルの文字列として解釈できる可能性があります。 Cスタイルの文字列は、文字配列に格納することも、配列ではない場所に格納することもできます(たとえば、メモリの読み取り専用部分であるため、他の値を「格納」できません)。