Array and pointer
新城@筑波大学情報です。こんにちは。
In article <bq71cp$nhf$1@news511.nifty.com>
<kounoike@mbh.nifty.com> writes:
> 単純なケースとして
> char * cc;
> char c5[5] = {'a', 'b', 'c', 'd', '\0'};
> とした場合、
> cc = &c5; //間違い
> cc = &c5[0]; //正しい
> cc = c5; //正しい
> になると思います。&c5[0]とc5は、同じ意味ですが、&c5は違う型を指すからです・
> ・かな。
どうかなあ。
私の感覚だと、「配列の名前だけ書いたら先頭要素のポインタにな
る」という仕様は、仕様のバグだと思います。歴史的に、配列のよ
うに(普通は)大きいメモリのコピーを禁止したかったというのは、
わかります。たとえば、関数呼出しの時に
------------------------------------------------------------
char c5[5];
f( c5 );
------------------------------------------------------------
と書くと、配列全体ではなくてその先頭番地(ポインタ)が送られ
ます。しかし、これを本当は、
f( &c5 );
と書くようにした方がよかったと思います。それで、f( c5 ) を意
味として禁止すると。
構造体も最初は代入もできなければ、引数で渡すのもできなかった
ですよね。配列も構造体と同じ扱いにすれば良かったと思います。
> 上の例の
> char (*c)[5];
> char c5[5] = {'a', 'b', 'c', 'd', '\0'};
> 場合で、
> c = &c5;
> とした時、cを用いて、c5[]の中身の 'a', 'b', 'c', 'd'を1つずつ表示さすには、
> どうすればよいか考えればその違いが分かるようになのではと思いますが。
そう言われてもよく分かりません。今のCコンパイラは、c5 も
&c5 も同じ値になります。
------------------------------------------------------------
% gcc -v
Using builtin specs.
gcc version 2.95.2 19991024 (release)
% cat array-c5.c
main()
{
char c5[5];
printf("%d, %d\n",c5,&c5);
}
% gcc array-c5.c
% ./a.out
-4262664, -4262664
%
------------------------------------------------------------
\\ 新城 靖 (しんじょう やすし) \\
\\ 筑波大学 電子・情報 \\
Fnews-brouse 1.9(20180406) -- by Mizuno, MWE <mwe@ccsf.jp>
GnuPG Key ID = ECC8A735
GnuPG Key fingerprint = 9BE6 B9E9 55A5 A499 CD51 946E 9BDC 7870 ECC8 A735