• ベストアンサー

C言語のポインタのことで

int num=15; int *p=# char h= 'A'; char *p=&h; って、数字や一文字の時は変数を用意しなくてはならないのに、 char *z="K"; ←ダブルクォーテーションで囲むと1文字もOK printf("%c\n",*z); とか、 char *name="名前"; printf("%s\n",*name); とかの場合、変数を用意しなくてもできますよね。 文字はどこか別の場所に保管されているのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • Wap58
  • ベストアンサー率33% (29/87)
回答No.4

誰もが最初に触るprintf("")関数の引数は 必ずダブルクォーテーションポインタでしょ "文字リテラル"もどっかに保存されます でも、そんな事にこだわる必要はありません ポインタは住所だから実体はさほど意識しないでも プログラムが動いてる間に存在してればいいのから 読み取り専用ののmallocとfreeを暗黙に行ってます printf("Hello World\n"); 上下のソースは同じで、"%s"はポインタの実体を表現する void *name = "Hello World"; printf("%s\n",name); 環境によって(char *)nameでキャスト ポインタを勉強するには本来の型を知らない住所のみの 小難しいvoidポインタから入る方が近道かもしれません

Black_Skal
質問者

お礼

>ポインタは住所だから実体はさほど意識しないでも >プログラムが動いてる間に存在してればいいのだから なるほど、あまり気にしなくてもいいのですね。 ポインタはなんだか、小難しいく感じますが、がんばってみます。 ありがとうございました。

その他の回答 (3)

  • titokani
  • ベストアンサー率19% (341/1726)
回答No.3

ちなみに、 "%c\n" "%s\n" も文字列リテラルですが、 char str[]="ABCDEFG"; とした場合の "ABCDEFG" は文字列リテラルではありません。 文字配列の初期化子になります。

Black_Skal
質問者

お礼

もう少し、文字の事勉強してみます。 ありがとうございました。

回答No.2

> char *z="K"; ←ダブルクォーテーションで囲むと1文字もOK > char *name="名前"; これらは文字列リテラルと呼ばれ、固定データ用の領域に確保され、そのアドレスがポインタに代入されます。そのため、変更は不可とされています。 char *ptr = "test"; *ptr = 'T'; // これはNG char str[10]; strcpy(str, ptr); str[0] = 'T'; // これはOK

Black_Skal
質問者

お礼

固定用の領域とかに確保されるんですね。 ありがとうございます。

  • mpascal
  • ベストアンサー率21% (1136/5195)
回答No.1

C言語を触ってたのはずい分昔ですが。 >文字はどこか別の場所に保管されているのでしょうか? 確保それていません。ポインタ用の変数だけが確保されていますので、コンパイル時にエラーが出るか、実行したら即エラーです。たまたま動いたとしても偶然だと思います。

Black_Skal
質問者

お礼

>確保されていません。 わかりました。 ありがとうございます。

関連するQ&A