• 締切済み

c言語の文字、また文字列について

c言語の文字、つまり「'(シングルクオーテーション)」で囲んだ単数の半角文字は、メモリに保存されているのでしょうか。 また、アドレスは有るのでしょうか。 c言語の文字列、つまり「"(ダブルクオーテーション)」で囲んだ複数の文字は、メモリに保存されているのでしょうか。 また、アドレスは有るのでしょうか。

みんなの回答

  • notnot
  • ベストアンサー率47% (4900/10358)
回答No.4

#2です。 >おかしな回答があるようなので、まずは事実関係の確認をしておきます。 すいません。筆?が滑りました。訂正しておきます。 Cでは、文字型(char, signed char, unsigned char)の値を持つ定数はありません。'A' というのは整数型の定数値です。つまりAの文字コードである 65 と書いたのと全く同じ。整数の定数値にCで言う意味でのアドレスはありません。 Cに文字列型はありません。"ABC" 等は文字列リテラルと呼ばれ、初期化された変更出来ないchar型配列です。この配列は静的記憶域期間を持つのでそのアドレスは定数と言えます。

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.3

おかしな回答があるようなので、まずは事実関係の確認をしておきます。 Cの場合、char, signed char, unsigned charの3つの型をひっくるめて「文字型(character types)」といいます。 それぞれの文字がどんな整数値になるかは処理系定義です。 (配列の初期化子以外の文脈での)文字列リテラルは、静的記憶域期間を持つchar型の配列です。ワイド文字列リテラルの場合はwchar_t型の配列になります。 たとえば、"ABC"という文字列リテラルであれば、char*型ではなくchar[4]型になります。 質問に対する回答ですが... 文字定数は右辺値なので、データとしてメモリに保存されることは普通ありません。また、右辺値なのでアドレスは取得できません。 メモリに保存される場合でも、プログラムのインストラクションにイミディエイト値として埋め込まれることが大多数ではないかと思います。 文字列の場合は左辺値ですので、原則としてメモリに保存され、アドレスも取得できます。ただし、最適化の結果、メモリに保存されないということはあり得ます。

  • notnot
  • ベストアンサー率47% (4900/10358)
回答No.2

Cには文字型はなく、'A' というのは整数型の定数値です。つまりAの文字コードである 65 と書いたのと全く同じ。整数の定数値にCで言う意味でのアドレスはありません。 Cに文字列型はなく、プログラム中に "ABCDEF" と書けば、それはABCDEF\0 という内容を持つ7バイトのメモリエリアの先頭アドレス(型は (char *) )を表します。つまり、char * 型の定数値です。

osiete_2011
質問者

補足

かなり強引な解釈かもしれませんが、c言語の文字列は、配列を「"(ダブルクオーテーション)」で囲んだ配列名として宣言して、「"」で囲んだ各文字を最後にNULL文字を含んで代入して、初期化したメモリの領域と考えれば合いますか。

  • yama1718
  • ベストアンサー率41% (670/1618)
回答No.1

処理系(コンパイラ)によりますが、 半角文字は直接レジスタへの値の代入の機械語にコンパイルされる場合が多いです。 つまりプログラムに組み込まれているという事でアドレス(ポインタ)は存在しません。 文字列はメモリ中に確保されて、レジスタへはそのアドレス(ポインタ)が代入される機械語なります、ですので文字列のアドレス(ポインタ)はありますが、そのメモリ領域は書き込み不可で保護されていて、無理に書き込むと保護エラーが発生する場合もあります。

osiete_2011
質問者

補足

c言語の文字はメモリに保存されず処理を実行するのでしょうか。 c言語の文字列はprintf関数で表示するだけでもメモリに保存されるのでしょうか。

専門家に質問してみよう