Article View: fj.lang.c
Article #587Re: [Q]配列とポインタについて
From: Masao Seki
Date: Sat, 14 Mar 1998 00:00
Date: Sat, 14 Mar 1998 00:00
46 lines
2428 bytes
2428 bytes
matuo wrote:
>
> 松尾です。
> 下のようなプログラムを作りました。エラーはなかったのですが、「間接参照が異
> なる」という警告がでているので、これをとろうと思ったのですが、とれません。
> プログラムはさどうします、一応。どうすればいいかどなたか教えてください。お
> 願いします。環境はvisual C++4.0
> です。
> #include <stdio.h>
> int yomikomi(int *x);
> int kensaku(int *x);
> int main(void)
> {
> int a[5];
> yomikomi(&a);
> kensaku(&a);
> return 0;
> }
配列名に「&演算子」を付けた時の取り扱いは、専門家がpcc(portable cc)と
呼んでいるSunOS4.Xなどにバンドルされている(ちょっと古い)Cコンパイラ
とANSI C準拠のコンパイラでは取り扱いが異なります。
pcc では配列名に「&」を付ける事は不当であり、エラー扱いで、完全に無視
されます。(warningは出ます。)ですから、コンパイル結果は
yomikomi(a) もしくは yomikomi(&a[0])
と記述したコードと同一になります。
ANSI Cでは、配列名に「&」を付ける事は正当ではありますが、結果は
型は元の配列へのポインタ、値は元の配列の先頭番地
になります。
つまり、この場合は「&a」の型は「int (*)[5]」であり、値は「&a[0]」となる
訳です。
VC++はCコンパイラとしては、ANSI準拠ですから、後者のケースに該当
します。従って、実引数の型が「int (*)[5]」で、仮引数の型の「int *」との
間で型の不一致が生じたという事です。
少し分かり難い説明だったかも知れませんが、この辺のきちんとした理解が
できるこどうかで、中級からさらには上級のCプログラマに脱皮できるかどうか
が決まると思いますので、頑張って理解して下さい。
#上級になるには、この他どれほどの知識が必要なのだろう。
--
関 正生 < masao.seki@fujixerox.co.jp || ma-seki@gb3.so-net.or.jp >
Technical Details
Message-ID:
<350A8FBD.3272@gb3.so-net.or.jp>Path:
arc1-ca.pugleaf.net!unknown!not-for-mailReferences:
<01bd4f11$769115a0$LocalHost@ma24659q>Show Full Headers
Complete Article Headers
X-Google-Language: Japanese,JIS X-Google-Thread: 106434,765df051791cc5a0 X-Google-Attributes: gid106434,public From: Masao Seki <ma-seki@gb3.so-net.or.jp> Subject: Re: [Q]配列とポインタについて Date: 1998/03/14 Message-ID: <350A8FBD.3272@gb3.so-net.or.jp> X-Deja-AN: 333998207 Content-Transfer-Encoding: 7bit References: <01bd4f11$769115a0$LocalHost@ma24659q> Mime-Version: 1.0 Reply-To: ma-seki@gb3.so-net.or.jp Content-Type: text/plain; charset=iso-2022-jp Organization: So-net Newsgroups: fj.lang.c