我在一本书中读到,
int f (int P[2][4])
不能接受 A[2][3]
,但可以接受 B[3][4]
。这是什么原因呢?特别是当我们使用指针创建动态分配时,这应该不是一个问题。谢谢。int f (int P[2][4])
不能接受 A[2][3]
,但可以接受 B[3][4]
。这是什么原因呢?特别是当我们使用指针创建动态分配时,这应该不是一个问题。谢谢。int f(int P[2][4]);
int f(int (*P)[4]);
P
是一个指向包含四个 int
的数组的指针。类型 int [3][4]
会衰减为相同的类型。但是类型 int [2][3]
衰减为类型 int (*)[3]
,它不兼容。
动态分配是完全不同的问题,无论如何都可能不涉及数组类型。 (更可能是指针数组。)
f(int P[2][4])
变成了 f(int (*P)[4])
,所以可以传递能够转化成 int (*B)[4]
的 int B[3][4]
,但是无法将 int A[2][3]
转化成 int (*A)[4]
,因此后者将不被 f(int (*P)[4])
接受。int (*)[3]
与 int (*)[4]
不兼容。它们之间无法相互转换! template<size_t M, size_t N>
int f(int (&P)[M][N])
{
//Use M and N as dimensions of the 2D array!
}
//Usage
int A[2][3];
f(A); //M becomes 2, N becomes 3
int B[3][4];
f(B); //M becomes 3, N becomes 4
它将接受所有二维数组!
[]
)。行大小(第一个[]
)是可选的。这与内存布局有关。第一个数字基本上是您的行数,第二个数字是每行中有多少元素。行直接放置在彼此之后。因此,它们的偏移量取决于前面行的元素数量乘以行数。编译函数将基于4个元素计算行偏移量。当您传递具有不同行长度的数组时,这些计算将是错误的。
第二个参数定义了2D数组的类型,因为每列中有多少元素是不同的。
第一个参数仅定义了数组的大小,由于您可以将更长的数组发送到该函数,就像传递类型为int * [3]的参数一样,这类似于将大小为10的1D数组传递给期望获得较短大小的数组的函数 - 这在C ++中是合法的。
litb
(let-it-be) :)很高兴在SO上看到James Kanze回答问题 :) - Prasoon Saurav