ショッピングモール  


【掲示板ご利用上の注意】

 ※題名は具体的に!
 ※学校の課題の丸投げ禁止!
 ※ソースの添付は「HTML変換ツール」で字下げ!
 ※返信の引用は最小限に!
 ※環境(OSとコンパイラ)や症状は具体的に詳しく!
 ※マルチポスト(多重投稿)は謹んで!

 詳しくはこちら



 本当はこんなに大きく書きたくはないのですが、なかなか守っていただけなくて…。
 守ってくださいね。お願いします。(by管理人)

C言語ソース⇒HTML形式ツール   掲示板1こちら


管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧

No.3121

変数側から宣言文を振りかえる。
投稿者---shu(2004/11/30 23:49:21)


宣言文の例

    int a;
    int arr[64];
    int arr_arr[64][64];
    int *p;
    int *p_arr[64];
    int **p_p;
    int func( void );
    
当たり前かもしれませんが、変数側から見た場合に、
宣言文での表記の形式が、int型(宣言した型)であるということ。
具体的に書くと、

    a
    arr[?]
    arr_arr[?][?]
    *p
    *p_arr[?]
    **p_p
    func()

これらの表記を、全てint型(宣言した型)の値として扱えるわけです。
宣言文と見比べてみてください。
(変数の初期化や、ポインタの設定は、正しく行われているものとする。)

変数の代入などは、意外と混乱しやすいので、知っておくと便利かも。

逆に、宣言文での表記の以外の形式、
具体的に書くと、

    arr
    arr_arr[?]
    p
    p_arr[?]
    *p_arr
    *p_p
    p_p
    
これらがなにを、表すのか?
int型(宣言した型)じゃあないよなぁ……。



この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:変数側から宣言文を振りかえる。 3125 かずま 2004/12/01 02:42:38


No.3125

Re:変数側から宣言文を振りかえる。
投稿者---かずま(2004/12/01 02:42:38)


> 宣言文の例

C++ では、int a; のような宣言が、文の書けるところに現れたら、それは
宣言文ですが、C では宣言は文ではありません。
C++ では、次のように書けますが、C ではエラーになります。

    if (a > 0)
        int i = printf("hoge\n");


従来の C で、複合文が

    { 宣言の並び 文の並び }

となっていたのが、C99 で、複合文が

    { ブロック構成要素の並び }
	
になりました。しかし、ブロック構成要素は、宣言または文ですから、
混在して書けはするものの依然として、宣言と文とは別のものと考えられ
ています。


>    int a;
>    int arr[64];
>    int arr_arr[64][64];
>    int *p;
>    int *p_arr[64];
>    int **p_p;
>    int func( void );
>    
> 当たり前かもしれませんが、変数側から見た場合に、
> 宣言文での表記の形式が、int型(宣言した型)であるということ。

a, arr, arr_arr, p, p_arr, p_p は変数。func は関数です。

宣言における a, arr[64], arr_arr[64][64], *p, *p_arr[64], **p_p, func(void)
は、宣言子です。

式における a, arr[?], arr_arr[?][?], *p, *p_arr[?], **p_p, func() は
式であり、その値は int 型です。

宣言における変数または関数の型は、

    arr     -- int [64]
    arr_arr -- int [64][64]
    p       -- int *
    p_arr   -- int *[64]
    p_p     -- int **
    func    -- int (void)

式においては次のように変換されます。

    arr     -- int *
    arr_arr -- int (*)[64]
    p       -- int *
    p_arr   -- int **
    p_p     -- int **
    func    -- int (*)(void)

ただし、例外は 単項&演算子のオペランドの場合と、sizeof演算子の
オペランドの場合です。その場合、変換されません。


> 逆に、宣言文での表記の以外の形式、
> 具体的に書くと、
>
>    arr
>    arr_arr[?]
>    p
>    p_arr[?]
>    *p_arr
>    *p_p
>    p_p
>    
>これらがなにを、表すのか?
>int型(宣言した型)じゃあないよなぁ……。

宣言におけるこれらの型は次の通り。

    arr        -- int [64]
    arr_arr[?] -- int [64]
    p          -- int *
    p_arr[?]   -- int *
    *p_p       -- int *
    p_p        -- int **


式におけるこれらの型は次の通り。

    arr        -- int *
    arr_arr[?] -- int *
    p          -- int *
    p_arr[?]   -- int *
    *p_p       -- int *
    p_p        -- int **



この投稿にコメントする

削除パスワード

No.3126

Re:変数側から宣言文を振りかえる。
投稿者---かずま(2004/12/01 03:21:41)


ひとつ抜けていました。

int *p_arr[64]; という宣言があったときに、*p_arr は何かという問題です。

まず、宣言においては、後置の配列宣言が強いので、
p_arr[?] はあっても、*p_arr というものは存在しません。

次に、式においては、p_arr が int ** に変換されているので、
*p_arr は int * になります。



この投稿にコメントする

削除パスワード

No.3146

Re:変数側から宣言を振りかえる。
投稿者---shu(2004/12/02 16:50:11)


>int *p_arr[64]; という宣言があったときに、*p_arr は何かという問題です。

>まず、宣言においては、後置の配列宣言が強いので、
>p_arr[?] はあっても、*p_arr というものは存在しません。

>次に、式においては、p_arr が int ** に変換されているので、
>*p_arr は int * になります。


この部分は、有るのか無いのか、はっきりしてないところがありました。
『宣言と式では扱われ方が異なる』ということ知り、すっきりできました。


この投稿にコメントする

削除パスワード

No.3127

Re:変数側から宣言を振りかえる。
投稿者---shu(2004/12/01 11:13:46)


詳しい詳しい返信、ありがとうございます。

詳し過ぎて、読み解くには、少し時間が掛かりそうですが、
ちびちび、楽しく解読してみます。

解読後の返信は、またそのときに。


この投稿にコメントする

削除パスワード

No.3151

Re:変数側から宣言を振りかえる。
投稿者---shu(2004/12/05 02:20:08)


『宣言は、文ではない』ということで、

>宣言における変数または関数の型は、

>    arr     -- int [64]
>    arr_arr -- int [64][64]
>    p       -- int *
>    p_arr   -- int *[64]
>    p_p     -- int **
>    func    -- int (void)

宣言で、上記のサイズ分の型を、メモリに確保して、

>式においては次のように変換されます。

>    arr     -- int *
>    arr_arr -- int (*)[64]
>    p       -- int *
>    p_arr   -- int **
>    p_p     -- int **
>    func    -- int (*)(void)

式では、上記のポインタなどを使って、
宣言されたメモリに、アクセスする。

と、いう解釈に行きつきました。



この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧




掲示板提供:Real Integrity