我有20x20矩阵。我想从矩阵中提取数据块。我有
int theMatrix[20][20] = {};//Full code initializes with #'s
int *theMatrixPointer = &theMatrix;
然后我收到编译器警告说
警告:初始化 不兼容的指针类型
我继续运行代码,它看起来是从左到右穿过矩阵。至少在短期内。实施:
//left to right with pointer;
while(theMatrixPointer)
{
int one = 0;
int two = 0;
int three = 0;
int four = 0;
double currentProduct = 0;
//int stop = 0;
for(int i = 0; i < depth; i++)
{
/*if(!theMatrixPointer)
{
stop = 1;
break;
}*/
int currentValue = *theMatrixPointer++;
printf("%d\n",currentValue);
if(i == 0)
{
one = currentValue;
}
else if (i == 1)
{
two = currentValue;
}
else if (i == 2)
{
three = currentValue;
}
else if (i == 3)
{
four = currentValue;
}
}
/*if(stop)
break;*/
currentProduct = one * (double)two * three * four;
printf("PRODUCT: %f\n",currentProduct);
startPoint++;
theMatrixPointer = startPoint;
}
...由于数据是垃圾(不在矩阵中的大整数),因此会中断。那么,我怎样才能用指针正确地迭代这个矩阵呢?
答案 0 :(得分:1)
首先,您收到警告的原因是&theMatrix
的类型为int(*)[20][20]
,而theMatrixPointer
的类型为int *
。你想要这个:
int *theMatrixPointer = &theMatrix[0][0];
其次,你得到垃圾的原因是你要经过数组的末尾。 while (theMatrixPointer)
会迭代到theMatrixPointer == 0
。但请记住,theMatrixPointer
是一个地址。在您遍历整个地址空间并回绕过来之前,这不会是0
!
你可能最好这样做:
int i, j;
for (i = 0; i < 20; i++)
{
for (j = 0; j < 20; j++)
{
// matrixPointer[i][j] is the current element
}
}
答案 1 :(得分:1)
检查我对类似问题here的回答。基本上,我认为处理Matrix [20 * 20]是一种比处理Matrix [20] [20]更明智的默认方法。