は一定の文字の配列である回答を願っています。 C言語は"
シンボルで区切られた文字列の最後に '\ 0'を追加するため、実際には5つの要素が含まれています。 Cでは、MEAT
のような配列オブジェクトは実際には配列の最初の要素へのポインタなので、MEATは実際には文字の配列全体ではなくメモリアドレスです!
const char[] MEAT = "Meat";
以下は、const char
へのポインタです。 *
シンボルはポインタであることを示します。(これは、タイプを指し示しているタイプを変数名で指定するかどうかは関係ありません。これは混乱する可能性があるため、通常はタイプ情報をまとめて名前を付けますが、最も一般的な規則ではありません。)favFood
変数は、MEAT
配列の最初の文字のアドレスで初期化されます。 (MEAT
は、メモリ・アドレスであるので、これは別のものを等しくするために、1つのメモリアドレスを設定していることを覚えておいてください。)
const char* favFood = MEAT;
を将来のある時点で、あなたの動物が突然それが実際に今、それはもはや肉が好きなことを決めていないともビスケットが好きです(猫が犬よりも心を変える可能性が高い、わかりますが、これは単なる例です)。
const char BISCUITS[] = "Biscuits";
/* Some code is done here, until you find... */
favFood = BISCUITS;
は今、MEAT
とBISCUITS
の両方は、あなたがそれらを変更することはできませんを意味し、一定であるが、favFood
は、文字列定数(とにかく文字列の最初の文字)に一定のが、ポイントそのものではないので、あなたはそれを変更することができます!
あなたはまた、非定数文字列持つことができます。
char nameAndFaveFood[50];
sprintf(nameAndFaveFood, "%.26s likes %.9s best.", name, favFood);
を...しかし、あなたはより多くの文字をコピーしていないことを確認してください - 終端の「\ 0」ヌル文字を含めて - あなたはスペースが割り当てられているよりも、この場合、49文字とターミネータが必要です。このため、sprint
関数には、サブ文字列の長さを制限する精度指定子があります。
変更可能なメモリへの固定ポインタを持つことができます。 LIKES_FOOD
オブジェクトがnameAndFaveFood
アレイの途中を指すように初期化されること
char* const LIKES_FOOD = &nameAndFaveFood[27];
注。それは常にそのアドレスを指します。前のコードブロックのルーチンをname
とfavFood
のパラメータで呼び出すことができますが、LIKES_FOOD
は常にnameAndFaveFood
配列の28番目の文字を指します。
私はそれがどこかを指しているが、これは文字列を取得するためにどのように使用できるのか分からない。たとえば、 "肉"を保持し、 'theDog.dogFaves.favFood'これは文字列ではなく、単一の文字 'M'を返しますか? – fdbdcbc
@ MGordon0405 - 'theDog.dogFaves.favFood'は何も返しません。 **は**文字列内の最初の文字のアドレスに評価され、文字自体には評価されません。 – StoryTeller
@ MGordon0405 - 今のところ文字列を忘れる。関数に整数の配列を渡す理由、最初の要素へのポインタ、配列の長さが必要なのは分かりますか? – StoryTeller