使用指针迭代仅适用于数组的一半

时间:2017-11-22 14:56:46

标签: c arrays pointers

我的程序有问题。我需要迭代一个二维数组并对其值进行操作(实际上它是一个.pgm图像)。用于循环的双效果很好,但我想使用指针。所以我试过这样的事情:

#define MAX 256
.
. 
.
void blur(int table[][MAX], int x_size, int y_size){
   int *ptr = table;
   for(int i=0;i<x_size*y_size;i++)
      ptr[i]= (int) ((1/3)*(ptr[i-1]+ptr[i]+ptr[i+1]))
}

它仅适用于阵列的一半。将x_size * y_size乘以2可以解决问题,但这不是一种不好的做法吗?

顺便说一下,这个功能应该水平给定图片模糊。这是对的吗?

2 个答案:

答案 0 :(得分:0)

使用

void blur(int table[][MAX], int x_size, int y_size)

table中的blur是指向int数组的指针,每个数组MAX。我不确定这是你想要的,但是如果你的阵列确实是这样形状的,那么每个“行”中都会有MAX - x_size 个未使用的条目。如果您只是尝试通过int指针和偏移来访问条目,您也将访问这些未使用的条目。

除此之外,从int (*)[MAX](指向int数组的指针,这是您实际传递给函数的指针)转换为int *(指向int的指针})不正确,不允许。所以最好完全忘记你的想法。

答案 1 :(得分:0)

菲利克斯指出,你的方法不正确。请考虑以下方法:

int matrix_main(void)
{
    int *matrix= malloc(x_size*y_size*sizeof(int));
    //
    // now fill matrix (not shown)
    //
    // now blur it
    blur(matrix, x_size, y_size);
    //...
}
void blur(int *ptr, int x_size, int y_size){
   for(int i=0;i<x_size*y_size-1;i++)
      ptr[i]= (int) ((1/3.0)*(ptr[i-1]+ptr[i]+ptr[i+1]))
}

请注意,从算法上讲,您正在处理每个像素多次。也许更好地创建一个新的矩阵。然后,您可以将其正确处理为所有周围像素的模糊。