[解決済み] C 言語のポインタ:固定サイズの配列へのポインティング
質問
この質問は、C言語の達人たちに送るものです。
C言語では、次のようにポインタを宣言することが可能です。
char (* p)[10];
...これは基本的にこのポインタが10文字からなる配列を指していることを表しています。このようにポインタを宣言すると、異なるサイズの配列のポインタをpに代入しようとすると、コンパイル時にエラーが発生します。また、単純なcharポインタの値をpに代入しようとすると、コンパイル時にエラーが発生します。
このようにポインタを宣言することは、特に関数にポインタを渡すときに、非常に便利であるように見えます。通常、人々はそのような関数のプロトタイプをこのように書くでしょう。
void foo(char * p, int plen);
もし特定のサイズのバッファを期待していたのであれば、単純にplenの値をテストするでしょう。しかし、pを渡した人が本当にそのバッファの有効なメモリ位置plenを与えるかどうかは保証できません。この関数を呼び出した人が正しいことをやっていると信じるしかないのです。一方
void foo(char (*p)[10]);
...は、呼び出し元が指定されたサイズのバッファを与えるよう強制します。
これは非常に便利なように見えますが、私が今まで遭遇したどのコードでも、このように宣言されたポインタを見たことがありません。
私の質問は、人々がこのようにポインタを宣言しない理由があるのでしょうか?私は何か明らかな落とし穴を見ていないのでしょうか。
どのように解決するのですか?
AndreyTの回答に補足します(このトピックに関する詳細情報を探してこのページにたどり着いた人がいるかもしれないので)。
これらの宣言でもっと遊ぶようになると、C ではこの宣言に大きなハンディキャップがあることに気づきます (C++ ではないようです)。自分が書き込んだバッファへの const ポインターを呼び出し元に与えたいという状況は、かなり一般的です。つまり、Cの標準(6.7.3 - パラグラフ8)はこのようなものと矛盾しているのです。
int array[9];
const int (* p2)[9] = &array; /* Not legal unless array is const as well */
この制約はC++にはないようで、この種の宣言ははるかに有用です。しかし C の場合、固定サイズのバッファへの const ポインタが必要なときはいつでも、通常のポインタ宣言に戻る必要があります (バッファ自体がそもそも const 宣言されている場合は別ですが)。より詳しい情報はこのメールスレッドで見ることができます。 リンクテキスト
もうひとつは、AndreyTが指摘したように、ほとんどの人はこのようにポインタを宣言できることさえ知らないという事実です。
関連
-
error: '.' トークンの前にunqualified-idを指定する必要があります。
-
[解決済み] 型付けされた関数ポインタ?
-
[解決済み] SQLiteのINSERT/per-secondのパフォーマンスを向上させる
-
[解決済み] なぜ、オブジェクトそのものではなく、ポインタを使用しなければならないのですか?
-
[解決済み] C言語で配列のサイズを決定するにはどうすればよいですか?
-
[解決済み] ++iとi++の違いは何ですか?
-
[解決済み] Cコードの単体テスト【終了しました
-
[解決済み] C 言語の配列へのポインタ/ポインタの配列の曖昧さ解消
-
[解決済み] フリーは、どのように無料化を知っているのですか?
-
[解決済み】C言語の関数ポインタはどのように機能するのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[C] レポートエラー 代入の左オペランドとしてlvalueが必要
-
赤線の位置は必ずしも間違っていない:式は変更可能なlvalueでなければならないエラーは、この文とは別の場所に存在する可能性があります。
-
警告: 'struct XXX' はパラメータリストの内部で宣言されています。
-
[解決済み] C言語の書式指定子 %ul と %lu の違いは何ですか?
-
[解決済み] C言語のコードで「:-!」とは何ですか?
-
[解決済み] printfにおけるdoubleの正しい書式指定子
-
[解決済み] アセンブリがCより速いのはどんなとき?[クローズド]
-
[解決済み] なぜalloca()の使用はグッドプラクティスとみなされないのでしょうか?
-
[解決済み] C言語で "unsigned long "をprintfする方法は?
-
[解決済み] C: char pointerとarrayの違い [重複].