如何把一个指针数组中的所有指针指向的值全部变为0

问题描述:

问题遇到的现象和发生背景

img

问题出现在一道C语言的题中

我的思路是按行和按列分别遍历给定的数组,将出现三个及上相同数字的这些数字的地址存入指针数组,最后把指针数组中的所有指针指向的值全部变为0
如果看我的代码太麻烦直接回答问题也行

问题相关代码,请勿粘贴截图
#include <iostream>
using namespace std;
//判断每一行中可消除的元素,
//并用指针数组中的指针指向这些元素
static int* clean_Line[30][30]={0};//保存每一行待消除的元素的地址
int* clean_Row[30][30]={0};//保存每一行待消除的元素的地址
void EqualLine(int arr[30][30], int n, int m)
{
    int i=0, j=0;
    int* temp= &arr[i][j];//第i行,第j列的元素地址
    //按行遍历整个数组
    for ( i = 0; i < n; i++)//n行循环
    {
        for ( j = 0; j < m-1; j++)
        {
            
            //如果该元素不等于下一个元素
            if (arr[i][j] != arr[i][j + 1])
            {
                
                temp = &arr[i][j+1];
            }

            //如果只有两个元素相同
            else if (arr[i][j] == arr[i][j + 1] && arr[i][j + 1] != arr[i][j + 2])
            {
            
                temp = &arr[i][j+1];
            }

            //如果出现三个及以上元素相同
            else
            {
                int cnt = 0;
                for (int s = 0; temp == (temp + 1); s++,temp++)
                {
                    clean_Line[i][s] = temp;
                    clean_Line[i][s + 1] = (temp + 1);
                    cnt++;
                }
                j = j + cnt - 1;
            }
        }
    }    
}
void EqualCol(int arr[30][30], int n, int m)
{
    int i=0, j=0;
    int* temp=& arr[j][i];//第j行,第i列的元素地址
    //按列遍历整个数组
    for ( i = 0; i < m; i++)//m列循环
    {
        for ( j = 0; j < n-1; j++)
        {
            
            //如果该元素不等于下一个元素
            if (arr[j][i] != arr[j+1][i])
            {
                temp = &arr[j+1][i];//向下走一列
            }

            //如果只有两个元素相同
            else if (arr[j][i] == arr[j+1][i] && arr[j+1][i] != arr[j+2][i + 2])
            {
                temp = &arr[j + 1][i];//向下走一列
            }

            //如果出现三个及以上元素相同
            else
            {
                int cnt = 0;
                for (int s = 0; temp == (temp + 1); s++,temp++)
                {
                    clean_Row[s][i] = temp;
                    clean_Row[s+1][i] = (temp + 1);
                }
                j = j + cnt - 1;
            }
        }
    }

}

int main()
{
    //输入n行m列
    int n, m;
    cin >> n >> m;
    //创建一个足够大的数组作为棋盘
    int arr[30][30];
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < m; j++)
        {
            cin >> arr[i][j];
        }
    }
    EqualLine(arr, n, m);
    EqualCol(arr, n, m);
    for (int s = 0; s < n; s++)
    {
        for (int t = 0; t < m; t++)
        {
            * clean_Line[s][t]=0;
        
        }
    }
    for (int s = 0; s < n; s++)
    {
        for (int t = 0; t < m; t++)
        {
            *clean_Row[s][t] = 0;
        }
    }
    
    for (int p = 0; p < n; p++)
    {
        for (int q = 0; q < m; q++)
        {
            cout << arr[p][q]<<" ";
        }
        cout << endl;
    }
    
    return 0;
}


我写的有点乱,刚入门,还请见谅

运行结果及报错内容

img


然后程序就停在了这个界面

调试时遇到的问题

img

我的解答思路和尝试过的方法

感觉可能是指针数组这个地方没有写好,还请指教

我想要达到的结果

供参考:

#include <stdio.h>
#define N 10 //行
#define M 10 //列
int main()
{
    int n, m, i, j;
    int a[N][M]={0}, b[N][M]={0};
    scanf("%d %d",&n, &m);
    for(i=0; i<n; i++)
        for(j=0; j<m; j++){
            scanf("%d", &a[i][j]);
            b[i][j] = 0;
        }

    for(i=0; i<n; i++)  //按行标记
        for(j=0; j<m; j++)
            if((a[i][j]==a[i][j+1]&&a[i][j]==a[i][j+2])||
               (a[i][j]==a[i][j+1]&&a[i][j]==a[i][j-1])||
               (a[i][j]==a[i][j-1]&&a[i][j]==a[i][j-2]))
            b[i][j] = 1;

    for(j=0; j<m; j++)  //按列标记
        for(i=0; i<n; i++)
            if((a[i][j]==a[i+1][j]&&a[i][j]==a[i+2][j])||
               (a[i+1][j]==a[i][j]&&a[i][j]==a[i-1][j])||
               (a[i][j]==a[i-1][j]&&a[i][j]==a[i-2][j]))
                b[i][j] = 1;

    for(j=0; j<m; j++)
        for(i=0; i<n; i++)
            if(b[i][j])
               a[i][j] = 0;
    for(i=0; i<n; i++)
    {
        for(j=0; j<m; j++)
            printf("%d ",a[i][j]);
        printf("\n");
    }
    return 0;
}