C言語で、仮引数に char[] a と書くのって、char* a と同じ意味になりますよね?

補足

char[] a ではなくて、char a[] でした。

C言語関連182閲覧

ベストアンサー

1

1人がナイス!しています

> なんか下の方のやりとりで「配列へのポインタ」という言葉が出ているけど、int (*)[5] みたいなものとの混乱はないですよね? 混乱してました! 仮引数に書かれた int* a や int a[] は、実引数が配列であろうとなんであろうと、関数内では int型へのポインタ以外の何物でもないのですね。 実行時に型情報が保存されていないので、関数内では a が int 型へのポインタである、という以上の情報を知るすべはないのですね。 (結局のところ「ポインタの配列へのポインタ」でも、「配列へのポインタ」でもない)

ThanksImg質問者からのお礼コメント

ありがとうございました!

お礼日時:5/25 5:50

その他の回答(5件)

0

void f(char *a)で aを本当に配列的に扱う場合は void f(char a[]); という書式にしておけば、何か問題が生じたとき void f(char a[1024]); とかに直し、コンパイルオプション 設定によってレンジチェックコードを埋め込ませると いったことを思いつけそうです。 「だから残されている」とまでは言い切れないと思い ますが。 void f(char a[]) でも void f(char a[12345]); でも void f(char a[][456]); でも void f(char a[123][456]); でもaはconstポインタ扱いでない点が 関数仮引数の特徴ともいえます。 その意味で、一般的な配列と混同させたくない というのはあるかもしれません。 補足 ライブラリ内の int a[123]; に対してライブラリユーザー側で extern int a[123]; とすればaはconstなintへのポインタ とみなされる点で、モジュール内定義 のものと何らかわりませんが だからといって extern int *const a; としてしまうとやはり上と同じにはな らないようです。 (微妙に同じになってもいい気もしますが) ライブラリに型情報が十分に埋め込まれないから なのか extern int *a; でもリンクに成功してしまい、問題が起きて しまうのはC言語ユーザーなら一度や二度 体験することかと。

0

常に配列がポインタになるわけではありません。 ファイルa.cppのグローバル領域に char abc[3] = {0, 1, 2} ; となっている場合に、 ファイルb.cppのグローバル領域に extern char abc[3] ; とすれば正しくアクセスできますけど、 extern char *abc ; では正しくアクセスできません。

0

以下、個人的な意見です。 これは他者に対してという意味ですが、「配列と混同する」ことへの配慮が期待されることもあると思います。C言語が苦手な人(他の言語が得意であっても)が含まれている集団の中においては、もしかすると大切なことなのかもしれません。 そうではなくて個人で勉強している場合、これは全く逆だと思います。 「配列と混同する」ということがもしあるとすれば、配列とポインタについて十分な復習が大切です。むしろどちらかに統一することは避け、char *a と char a[] の両方を適宜使い分ける(使い分けを常に考える)ようにすることが望ましいと考えます。

0

前者の配列と混同すると思うなら辞めればいい。 そう書く人はそう書くことでポインタと混同することを恐れているのでしょう