2008年6月23日月曜日

第11章 文字列とポインタ

おなかがいたい。。。こつこつ。


  • 11-1 文字列とポインタ

    • list1101:おお、char *ptr = "123";という初期化も可能なのか。
    • 気になるのは、配列 - 文字列 - ポインタという関連性が、言語としてのC言語において、構文糖衣なのかそれ以上の違いがあるのか、ということ。パタヘネによると、直接アセンブリ言語にコンパイルする場合は違いがある。でもgccはGENERICとかの中間表現に変換するから、そのときにどうなのか、ということも気になる。
    • list1103:まず、配列で初期化した識別子は、その配列が初期化時に確保した領域と結合しており、別の領域を指すように変更はできない。つまり、例えば、str = "DEF";という形での代入はできない。
    • list1104:次に、配列は領域の予約というか、事前確保が可能ということ。char str[6] = "ABC";としておけば、strが指す領域はchar*6確保され、保護される。しかし、int *ptr = "ABC"の場合は、ABC\0が文字列リテラルとしてメモリ上のどこかに生成されているとして、その先頭アドレスを指すということにすぎない。
    • というわけで、配列とポインタは、識別子管理テーブル(勝手につけた名前)の機構に関する違いがあるようだ。管理テーブル的にはポインタでやった場合は、文字列リテラルを格納するメモリ領域とは分離して、ポインタ自体の識別子と領域も別途管理されるということ。
    • しかし、識別子管理テーブルとかいっても仮想マシンがあるわけではないので、けっきょく中間言語だったりというコンパイラの仕様しだいなのか?
    • ところでC言語って、"ABC"という文字列リテラルは共有されるのかなぁ。char *ptr1 = "ABC"; char *ptr2 = "ABC";としたとき、ptr1とptr2は同じアドレスを指しているのか否か?
    • list1105:char *pt[3]ってありなんだ。。。



とりあえず、ここまで。

0 件のコメント: