🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: fj.lang.c
Article #587

Re: [Q]配列とポインタについて

#587
From: Masao Seki
Date: Sat, 14 Mar 1998 00:00
46 lines
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-mail
References: <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