ホームページ >バックエンド開発 >C++ >C で多次元配列をポインターの配列として関数に渡せないのはなぜですか?

C で多次元配列をポインターの配列として関数に渡せないのはなぜですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-12-15 15:03:22810ブラウズ

Why Can't I Pass a Multidimensional Array to a Function as an Array of Pointers in C  ?

多次元配列を関数に渡すことができないことを理解する

次のコード スニペットを考えてみましょう。

#include <stdio.h>
void print(int *arr[], int s1, int s2) {
    int i, j;
    for(i = 0; i < s1; i++)
        for(j = 0; j < s2; j++)
            printf("%d, ", *((arr + i) + j));
}

int main() {
    int a[4][4] = {{0}};
    print(a, 4, 4);
}

このコード多次元配列 a を int ポインター int の配列を取る関数 print に渡すことを目的としています。 *arr[]。ただし、C では、このコードは次のエラーを生成します:

cannot convert `int (*)[4]' to `int**' for argument `1' to
`void print(int**, int, int)'

説明:

この問題の核心は、互換性のないデータ型にあります。 a のような C スタイルの多次元配列は、ポインターの配列へのポインター int *arr[] に直接変換できません。 C では、 a のデータ型は int[4][4] で、整数の 2 次元配列を表します。一方、 int *arr[] は整数の配列へのポインタであり、各要素は整数へのポインタです。

解決策:

この問題を解決し、多次元配列を int ポインターの配列を受け取る関数に渡すと、コードを変更して多次元配列を明示的に次の配列に変換できます。ポインタ。これは、「多次元配列を C のポインターに変換する」という質問に対する受け入れられた回答で説明されているような手法を利用することで実現できます。

補足:

  • 最初の例で示したコードは、印刷コードに追加のバグがあるため、C では予期しない動作を示します。
  • これは重要です。配列 a をゼロ以外の値で初期化し、配列受け渡しのバグの影響を観察します。
  • 印刷バグのため、配列受け渡しのエラーは C でマスクされます。
  • C エラーメッセージは変換の問題を明確に示しますが、C コンパイラは誤って無視できる警告を発行する場合があります。

以上がC で多次元配列をポインターの配列として関数に渡せないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。