如果可能出现以下情况:
MyFunction(int *array, int size)
{
for(int i=0 ; i<size ; i++)
{
printf(“%d”, array[i]);
}
}
main()
{
int array[6] = {0, 1, 2, 3, 4, 5};
MyFunction(array, 6);
}为什么下面的不是呢?
MyFunction(int **array, int row, int col)
{
for(int i=0 ; i<row ; i++)
{
for(int j=0 ; j<col ; j++)
{
printf(“%d”, array[i][j]);
}
}
}
main()
{
int array[3][3] = {0, 1, 2, 3, 4, 5, 6, 7, 8};
MyFunction(array, 3, 3);
}发布于 2010-10-12 10:32:31
编辑:根据您的新示例代码,根据您的请求,我尝试了一个更中肯的答案:
不管数组的维数如何,您传递的是一个“指向数组的指针”--它只是一个指针,尽管指针的类型可能会有所不同。
在第一个示例中,int array[6]是一个由6个int元素组成的数组。传递array会传递一个指向第一个元素的指针,该元素是一个int,因此参数类型是int *,它可以等效地写成int []。
在第二个示例中,int array[3][3]是一个包含3行(元素)的数组,每行包含3个int。传递array会传递指向第一个元素的指针,该元素是包含3个int__s的数组。因此类型为int (*)[3] -指向包含3个元素的数组的指针,可以等效地写为int [][3]。
我希望你现在能看到不同之处。当您传递int **时,它实际上是指向int *数组的指针,而不是指向2D数组的指针。
实际int **的示例如下所示:
int a[3] = { 1, 2, 3 };
int b[3] = { 4, 5, 6 };
int c[3] = { 7, 8, 9 };
int *array[3] = { a, b, c };这里的array是一个由3个int *组成的数组,将其作为参数传递将产生一个int **。
原始答案:
您的第一个示例并不是真正的二维数组,尽管它的使用方式与此类似。在这里,您创建了ROWS个char *指针,每个指针指向一个不同的COLS字符数组。这里有两个层次的间接性。
第二个和第三个示例实际上是2D数组,其中整个ROWS * COLS字符的内存是连续的。这里只有一层间接性。指向二维数组的指针不是char **,而是char (*)[COLS],因此您可以这样做:
char (*p)[SIZE] = arr;
// use p like arr, eg. p[1][2]发布于 2010-10-18 21:07:29
其他人几乎总结了这一点。int **A表示A是指向数组的指针,而不是指向二维数组的引用。然而,这并不意味着它不可用。因为C中的数据是以行为主的顺序存储的,所以一旦知道了行的长度,检索数据就应该很容易了
发布于 2010-10-12 10:20:09
因为指针指针与指向数组的指针不是同一类型。详情请参见pointers to pointers and pointer arrays。
另外,这里有一些好的信息:http://c-faq.com/aryptr/index.html
https://stackoverflow.com/questions/3911244
复制相似问题