this質問を参照するとlitbの特に受け入れanswerを渡す、私は疑問に思う:私はconst
を排除定数行列
void func(const int (*ip)[3]) {
printf("Value: %d\n", ip[1][1]);
}
int main() {
int i[3][3] = { {0, 1, 2} , {3, 4, 5}, {6, 7, 8} };
func(i);
return 0;
}
場合、コンパイラは、静止しています。私は何か誤解しましたか? func
が配列を変更しないようにしたいと思っていました。
EDIT:
typedef int Array[3][3];
void func(const Array *p) {
printf("Value: %d\n", (*p)[1][1]);
}
int main() {
Array a = { {0, 1, 2}, {3, 4, 5}, {6, 7, 8} };
func(&a);
return 0;
}
私は受け入れるが、この種のコードは、より多くのCのような、非常にCのスタイルではありません++:私は私の行列のデータ型を定義する場合同じことが起こります。 C++では、Arrayをすべての行列の振る舞いを含むクラスとして定義すると、実際には問題はありません。
class Array {...};
私は、Cの配列の配列と配列の概念をよく理解しておらず、関数に渡していると思います。啓蒙主義?
ありがとうございます。
EDIT2:一方私はこの問題について少し噛んだし、次の質問に収束するようだ:C/C++は、暗黙のうちにconst int
へのポインタにint
へのポインタに変換します。したがって、次の作品:
func(const int a[]) // aquivalent: func(const int *a)
{ ... }
int main()
{
int b[10];
func(b);
return 0;
}
しかし、C/C++は、暗黙的にn個const int
の配列へのポインタへのn int
の配列へのポインタを変換しません。 n int
の配列は、暗黙的にn const int
の配列に変換されます。暗黙的変換でのこの間接レベルはサポートされていません。以下は、(少なくともCで警告と)拒否されます。
func(const int a[][n]) // aquivalent: func(const int (*a)[n])
{ ... }
int main()
{
int b[m][n];
func(b);
return 0;
}
それは、C++が暗黙のうちにもできるかどうかタイプBのテンプレートにタイプAのテンプレートを変換しない問題に似ています暗黙的にBに変換されます.2つのテンプレートは完全に異なるタイプです。
これは正しい答えですか?
申し訳ありませんが、私はまだコンパイラがこの場合に警告をスローする理由はありませんでした。何か案は? – phlipsy