如果可能出现以下情况:
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-19 01:22:33
这段代码有两个主要问题。
MyFunction(int **array, int row, int col);第一个问题是int **array是错误的类型。这是指向指针的指针,而
int array[3][3] = {0, 1, 2, 3, 4, 5, 6, 7, 8};是一个多维数组。组成这个多维数组的内存都是一个块,并且从这个数组的开头到这个数组的任何元素的偏移量都是基于对这个数组中一行的大小的了解来计算的。
int *A[99];这是一个指向整数的指针数组。所指向的整数可能是内存中几个整数中的第一个,这意味着这些整数实际上指向整数数组。
在许多情况下,当您在程序中使用数组的名称时,它的计算结果是指向数组开头的指针。如果你说:
int array[3][3] = {0, 1, 2, 3, 4, 5, 6, 7, 8};
printf("%p %p %p\n", array, array[0], &(array[0][0]) );您应该将相同的地址打印3次,因为它们都指向相同的地址,但它们的类型并不相同。后两者的数据类型相似,并且在许多方面都是兼容的,因为array[0]将被视为指向array第一行的第一个元素的指针,而该行本身就是一个数组。
如果你说:
int **A;您是说有一个指向int的指针。虽然A[2][4]是一个有效的表达式,但它不是多维数组,其方式与:
int B[3][3];如果你说A[1],这将计算成一个类似于B[1]的int *,除了你可以说A[1] = (int *)0x4444;,但是如果你说B[1] = (int *)0x4444;,你会得到一个编译器错误,因为B[1]实际上是一个计算值,而不是一个变量。对于B,没有int *变量的数组--只是根据行大小和数组的第一个成员的地址进行一些计算。
这段代码应该做一些与您想要的事情类似的事情(为了可读性,对输出格式进行了一些更改)。请注意print语句中的索引值是如何更改的。
MyFunction(int *array, int row, int col)
{
int x = 0;
for(int i=0 ; i<row ; i++ )
{
for(int j=0 ; j<col ; j++)
{
printf(“%d ”, array[x++]);
}
printf("\n");
}
}
main()
{
int array[3][3] = {0, 1, 2, 3, 4, 5, 6, 7, 8};
MyFunction(array, 3, 3);
}https://stackoverflow.com/questions/3911244
复制相似问题