• 締切済み

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

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

みんなの回答

  • notnot
  • ベストアンサー率47% (4848/10262)
回答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% (4848/10262)
回答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関数で表示するだけでもメモリに保存されるのでしょうか。

関連するQ&A

  • 文字列の置換について。

    ダブルコーテーションで囲まれ文字列が あったとします。 その文字列の中に含まれる半角カンマを なくしたいのですが、 リプレイスだと反応がありません。 その他の文字は置換出来るのですが。 どなたから、ダブルコーテーションに囲まれた 文字列の中の半角カンマを取り除く方法が ありましたらアドバイス下さい。 どうぞよろしくお願いします。

    • ベストアンサー
    • Java
  • C言語 文字列 比較に関する質問

    C言語の文字列で数字を比較する場合以下の3パターンがあります  1.X > 5      2.X > ”5”   3.X > ’5’ あるchar属性の Yがあるとします  char Y;  Strncpy(Y,”5”);   YY=atoi(Y);    上記1は  X > Y  上記2は  X > YY となりますが  上記3のシングルコーテーションとして  比較する関数を教えてください    

  • 正規表現:囲われた文字列の置換

    シングルクオーテーションで囲われた文字列のシングルクオーテーションの前に文字を追加するように、正規表現を用いて置換しようと考えています。 全角文字は[^\x01-\x7E]で検索できるのはわかったのですが、シングルクオーテーションで囲われて、全角文字を含む場合という表現ができません。 下記のような、文字列を対象としています。置換をするのは、全角文字を含む文字列のみです。  全角文字のみ  半角文字のみ  全角半角文字両方 下記ののように置換したいです。 置換前: '全角文字や半角文字','testです','test'.'テスト'.'てすとtest','123' 置換後: A'全角文字や半角文字',A'testです','test'.A'テスト'.A'てすとtest','123' よろしくお願いします。

  • PHP コードを文字列として出力する方法

    お世話になります ダブルクォーテーションで囲っても 「PHP コード」を「文字列」として出力する方法 つまり、evalの逆の関数のようなものはありますでしょうか $a['huga'] = 2; $b['hoge'] = 3; //式 $c = $a['huga'] * $b['hoge'] ; abc($c = $a['huga'] * $b['hoge'] ); function abc($str){ //ここでなんちゃらほんちゃら //もしくはfunctionの外側でなんちゃらもでも可 echo $str; } 期待する出力結果 $c = $a['huga'] * $b['hoge'] ; 実際の結果 6 $の前に¥を入れてダブルクォーテーションで囲めば、 または、シングルクォーテーションの前に¥を入れてシングルクォーテーションで囲めば 文字列になるのはわかりますが 式の文字列には直接、手を加えず関数等で実現するやり方が知りたいです ※連想配列のキーの囲み文字はシングルクォーテーションです、ダブルに出来ない条件でお願いします。 お忙しい中恐縮ですが熟練者の方でわかる方がいましたら お教え下さいませ

    • ベストアンサー
    • PHP
  • 上手な文字列の分割方法

    こんばんは、早速ですが質問があります。 Rich Textbox Controlで言語設定をして色付けを行いたいのです。 たとえばVisual Basicの色指定にしたときには、キーワードを青色に、コメント行を緑に、といった色付けになります。 Dim I As Long 'カウンタ変数 [Dim][As][Long]を青色に、['カウンタ変数]を緑色にするような感じです。 上記のような単純なものはよいのですが、 MsgBox "C:\Fallin'Love.mp3" という記述があった時に、シングルクォーテーションが読み込まれ['Love.mp3"]の部分が緑色になってしまいます。 今はダブルクォーテーション内かどうかのフラグを使用してInStr(StartPoint,str,"""){始端と終端の位置を先に求める}で凌いでいますが、どうも汚いソースに見えて仕方がないのです。 しかし、このままではC言語に発展させたときに '"'や'A'、"ABC" が出てきたり、 HTMLでも 'Document.Write(OnClick="JavaScript:History.back")' 等といったシングル/ダブルクォーテーションをそれぞれ文字列の囲いとして使用する書式があるので挫折するのは目に見えています。 DLLやコンソールアプリのコマンドラインでのファイル名指定などではダブルクォーテーション内の半角スペースもうまく処理している(普通の半角スペースはスイッチの区切りとしてみなす)ので、何か良い方法があるのかと思い、質問させていただきました。 何卒、ご教授願います。

  • C言語で文字列操作を忘れてしまいました。

    長い間スクリプト言語ばかりやっておりまして、C言語に戻ると、文字列を返す 関数を作ろうとしましたが、お恥ずかしいながらできませんでした。 ローカル変数の値を戻り値に使おうとして、それがwarningになったり、動作が不安定になったりして、文字列を返す仕組みを完全に忘れてしまっていました。 例えば、"test"と言う文字列を返す関数を書きたいのですが、メモリ操作も考えた サンプルをだれか教えて欲しいです。 int main(void) { printf("%s", 「関数名」); }

  • スクリプト言語で文字列を囲む "" '' の厳密な使い分け?

    スクリプト言語、Perl, PHP, Pythonでよく a = "文字列" b = '文字列' のように、ダブルとシングルが使われますが、 サンプル等は''シングルが多いですが、私は元々VBをよく使っていたので、""の方が馴染みます。 ''との違いは""は中で変数が展開されることだと思いますが それ以外で使い分ける厳密な理由はありますか?

    • 締切済み
    • PHP
  • C言語で取得した文字列を、C++の文字列として取り扱いたいです。

    C言語で取得した文字列を、C++の文字列として取り扱いたいです。 皆さんこんにちは。 C言語で取得したchar型で定義された文字列を、 C++の「std::string」に渡したいと思っております。 どうすればかなうでしょうか? 具体的には次のような内容です。 ■C言語側 ---- char key1 = "deperture"; ---- ■C++側で「key1 = key2」としたいです。 ---- std::string key2 = key1; ---- C言語側で記述されている「key1」の値(deperture)を、 C++ソース内の「key2」に渡したいと思っています。 こうゆう場合、どんな方法をとれば適切でしょうか。 C言語側でのchar型の文字列の値を、 C++側の「std::string」型として C++のソースへ渡す方法が分からないです。 アドバイスいただけるとありがたいです。 簡単な例を頂けると更に大変ありがたいです。 以上どうぞ宜しくお願い致します。

  • 半角シングルコーテーションを文字列として扱う方法

    VB6にて、シングルコーテーションを文字列として使用したいのですが、良い方法はないでしょうか。 例:マンション名等で   ○○○k's A棟        ↑   でシングルコーテーションを半角で使用したい。

  • シングルクォーテーションを含む文字列の更新

    題名のとおりなのですが、データベースに更新するデータに シングルクォーテーションを含む文字があって、更新時にエラーとなってしまいます。 更新する文字列内にシングルクォーテーションの数が奇数あれば、さらに文字列にシングルクォーテーションを追加して、更新しようとしたんですが、ダメでした。 何か参考になるサイト、解決策をご存知の方、宜しくお願いします。 環境: OS:WinXPSP2 言語:VB6SP6 DB:SQLServer2000

専門家に質問してみよう