次はgcc
バージョン6.3で有効なc
コードとして受け入れられていますこれが合理的な理由であるとはいえ、私はそれが何であるか不思議です。この質問は、"\x43\xde\xa0"
ではなく{ '\x43', '\xde', '\xa0' }
のようなものを書き込むことが非常に魅力的で、*my_array
の代わりにmy_array[]
を書くのを忘れるとすぐに、バイト配列(unsigned char
ではなくchar
ではなく)を初期化する必要がある場合の動機になります。コンパイラに捕まってしまう。C char型の配列vのCのchar *を初期化
答えて
あなたが信じているようの初期化子は、文字の配列されていないため、次のエラー
char *green = { 'a', 'b', 'c' };
を生成します。それは型を持たない、それは単に中括弧で囲まれたイニシャライザリストです。以前のサンプル(つまりwhite
)で初期化されたものが、その解釈方法を決定します。同じ文字列を使用して、3文字を保持できる集約を初期化することができます。
しかし、は、ポインタであり、集約ではないため、初期値として中括弧で囲まれた初期化リストを使用することはできません。
今は、次の2つの作業が、非常に異なる意味を持つ:
char blue[] = "abc";
char *red = "abc";
blue
配列です。リテラルと同じ内容を保持します。 red
はのポインターで、の文字はです。
あなたがcompound literal expression使用することができます。
char *green = (char[]){ 'a', 'b', 'c' };
それは無名のオブジェクトを作成するために、コンパイラに指示します(宣言のスコープに依存するの寿命を)、それはですこれらの3文字で初期化されます。ポインタにはそのオブジェクトのアドレスが割り当てられます。
すべてが本当です。しかし、イニシャライザのリストを 'char'配列のリテラル(文字列リテラルではなく)に変更し、' char * '宣言の意味を議論することで、' char *そうする。 –
@JohnBollinger - 私は複合リテラルについての情報を入力していました。 – StoryTeller
@StoryTeller大変ありがとうございます。 –
これらの三つの宣言
char white[] = { 'a', 'b', 'c' };
char blue[] = "abc";
char *red = "abc";
は異なっています。
最初の文字は、イニシャライザの数に対応する3文字の文字配列を宣言します。
2番目の文字配列は、終了ゼロを含む4文字の文字列リテラルによって初期化されるため、4文字の文字配列を宣言します。したがって、この文字配列には文字列が含まれています。
文字配列である文字列リテラルを定義し、文字列リテラルに対応する文字配列の最初の文字のアドレスによって初期化されるタイプchar *
のポインタを宣言します。
あなたは左のオブジェクトがスカラーで、複数の初期化子を含むリストによって初期化されていない可能性があるため、この宣言
char *green = { 'a', 'b', 'c' };
が無効である
char unnamed = { 'a', 'b', 'c', '\0' };
char *red = unnamed;
のように、この宣言を想像することができます。
複合リテラルを使用してポインタを初期化できることを考慮してください。たとえば、
char *green = (char[]){ 'a', 'b', 'c' };
ありがとうございました –
@SvenWilliamson全くありません。どういたしまして。 –
- 1. C/C++初期化のchar配列がchar constのための*
- 2. 配列charのC++での初期化
- 3. 2d char配列の初期化C
- 4. C++ - 静的なcharポインタの配列を初期化する
- 5. char配列の初期化とデストラクタ
- 6. char配列の配列C++
- 7. Cのchar配列?
- 8. Cのchar型
- 9. C++は、C++でchar配列
- 10. char配列のcharをANSI Cの独自のchar配列に変換する
- 11. C char配列ポインタ
- 12. C++ Cでchar配列
- 13. Cプログラミング、charポインタの配列
- 14. char配列へのポインタC++
- 15. Intと* Char-C++の配列
- 16. C constの配列unsigned char [] []
- 17. C++ char配列のスコープ
- 18. C charの配列を宣言する*
- 19. charポインタの初期化
- 20. C配列の初期化
- 21. C++ char配列をintに、intをchar配列に
- 22. charの配列とC++のcharへのポインタ
- 23. C++ char配列のコピーをunsigned char配列に置き換えます。
- 24. は(Cで)1D char配列
- 25. Cビット操作char配列
- 26. char ** vs char * c []文字列配列へのアクセス用
- 27. C:はunsigned char *は他のunsigned char型に配列複写要素バイト・アレイ
- 28. エラー: 'char'型の一時的な型からの 'char&'型の非const参照の初期化が無効
- 29. C文字列(char配列):ので、スペース
- 30. char * []配列を初期化するには?
文字列の末尾にヌルターミネータ( '\ 0')がないため、' white'の定義は他の2つの文字列と同じではありません。 – abelenky
@abelenkyああ、これは私が見落とした良い点です、ありがとうございます。 –
'char * green = {" a "、" b "、" c "};' ....;) – LPs