梦呓_ 2021-12-02 17:59 采纳率: 81%
浏览 49
已结题

如何把一个指针数组中的所有指针指向的值全部变为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

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

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

我想要达到的结果
  • 写回答

1条回答 默认 最新

  • qzjhjxj 2021-12-02 21:06
    关注

    供参考:

    #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;
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 1月8日
  • 已采纳回答 12月31日
  • 修改了问题 12月2日
  • 创建了问题 12月2日

悬赏问题

  • ¥15 c程序不知道为什么得不到结果
  • ¥40 复杂的限制性的商函数处理
  • ¥15 程序不包含适用于入口点的静态Main方法
  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置