| 网站首页 | 业界新闻 | 群组 | 交易 | 人才 | 下载频道 | 博客 | 代码贴 | 编程论坛
共有 453 人关注过本帖
标题:指针型二维数组,赋值后相互干扰,求解
只看楼主 加入收藏
kfyniriu
Rank: 5Rank: 5
等 级:职业侠客
威 望:7
帖 子:98
专家分:372
注 册:2018-7-6
结帖率:100%
  已结贴   问题点数:20  回复次数:9   
指针型二维数组,赋值后相互干扰,求解
#include<stdio.h>
#include<stdlib.h>


int main()
{
    int *p,n,m,i,j,x,y;
    printf("输入魔方的阶数:");
    scanf("%d-%d",&n,&m);
   
    p=(int *)malloc(sizeof(int)*n*m);
   
    for(i=0;i<n;i++)
    {
        for(j=0;j<m;j++)
        {
            *(p+i+j)=0;
            printf("%5d",*(p+i+j));
        }
        printf("\n");
    }
   
   
   
    x=0;
    y=m/2;
   
   
    *(p+x+y)=1;
   
    printf("\n\n");
   
    for(x=0;x<n;x++)
    {
        for(y=0;y<m;y++)
            printf("%10d",*(p+x+y));
        printf("\n");
    }
return 0;
}


以上为代码

我输入的是3-3的数组,数组初始化全部赋予0,打印出来是这样子的
0   0   0
0   0   0   
0   0   0

将*(p+0+1)=1后,我希望得到的是
0   1   0
0   0   0
0   0   0

但实际出来的是
0   1   0
1   0   0
0   0   0

请教大神,是哪里出了问题?

[此贴子已经被作者于2018-7-7 21:55编辑过]

2018-07-07 21:27
nosnoy
Rank: 8Rank: 8
来 自:mcu
等 级:蝙蝠侠
威 望:8
帖 子:439
专家分:832
注 册:2016-9-17
  得分:15 
虽然我没用过这种 但是看你的for循环我理解了一下 如果不对的地方当作笑话看吧 ,
当 i= 1,j= 1;i1=0,j1=2时
  *(p+i+j) == *(p+i1+j1)

所以我觉得你的指针型二维数组定义错了

 *(p+i+j)=0;应写成 *(p+i*n+j)=0 吧

电闪雷鸣之际 ,当心无杂念,安心渡劫
                                         -18.06.21
2018-07-07 21:51
kfyniriu
Rank: 5Rank: 5
等 级:职业侠客
威 望:7
帖 子:98
专家分:372
注 册:2018-7-6
  得分:0 
回复 2楼 nosnoy
for(i=0;i<n;i++)
    {
        for(j=0;j<m;j++)
        {
            *(p+i+j)=0;
            printf("%5d",*(p+i+j));
        }
        printf("\n");
    }

这个循环语句将二维数组所有的值赋值为0,将 *(p+i+j)=0 修改为 *(p+i+j)=j  ,显示的结果是正确的。

但下面的语句

*(p+x+y)=1;   这里的  x=0,y=1  ,将第一行,第二个数赋值为1。结果显示为
0  1  0
1  0  0
0  0  0

数组的第二行,第一列的值本来是为0的,但是也被改变为1。如果扩大数组的维度的话,那么一条斜线上的0都会被改变为1.  
2018-07-07 22:01
nosnoy
Rank: 8Rank: 8
来 自:mcu
等 级:蝙蝠侠
威 望:8
帖 子:439
专家分:832
注 册:2016-9-17
  得分:0 
回复 3楼 kfyniriu

自己看图
程序代码:
#include<stdio.h>
#include<stdlib.h>


int main()
{
    int *p,n,m,i,j,x,y;
    printf("输入魔方的阶数:");
    scanf("%d-%d",&n,&m);
   
    p=(int *)malloc(sizeof(int)*n*m);
   
    for(i=0;i<n;i++)
    {
        for(j=0;j<m;j++)
        {
            *(p+i+j)=j;
            printf("%5d",*(p+i+j));
        }
        printf("\n");
    }
   
      for(i=0;i<n;i++)
    {
        for(j=0;j<m;j++)
        {
          printf("%5d",*(p+i+j));
        }
        printf("\n");
    }
   
  
return 0;
}


附件: 您没有浏览附件的权限,请 登录注册

电闪雷鸣之际 ,当心无杂念,安心渡劫
                                         -18.06.21
2018-07-07 22:38
nosnoy
Rank: 8Rank: 8
来 自:mcu
等 级:蝙蝠侠
威 望:8
帖 子:439
专家分:832
注 册:2016-9-17
  得分:0 
回复 3楼 kfyniriu
你可以现去看下二维数组的存储方式 然后在用指针替代,有车不开,一定要走路

[此贴子已经被作者于2018-7-7 22:44编辑过]

附件: 您没有浏览附件的权限,请 登录注册

电闪雷鸣之际 ,当心无杂念,安心渡劫
                                         -18.06.21
2018-07-07 22:38
自学的数学
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:17
帖 子:603
专家分:2418
注 册:2017-11-15
  得分:0 
在我的机器上运行, scanf("%d-%d",&n,&m);还有问题,改成如下就好了:
 scanf("%d %d",&n,&m);
2018-07-07 23:37
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:169
帖 子:6387
专家分:28007
注 册:2014-5-20
  得分:5 
*(p+i*m+j)
2018-07-07 23:44
kfyniriu
Rank: 5Rank: 5
等 级:职业侠客
威 望:7
帖 子:98
专家分:372
注 册:2018-7-6
  得分:0 
回复 5楼 nosnoy
代码修改成指针替代二维数组的方式,怎么修改呢?还望不吝赐教
2018-07-08 09:49
nosnoy
Rank: 8Rank: 8
来 自:mcu
等 级:蝙蝠侠
威 望:8
帖 子:439
专家分:832
注 册:2016-9-17
  得分:0 
回复 8楼 kfyniriu
假设数组为 a[3][4] 那么首地址为 a[0][0]的地址假定为a1     则a[2][3]的地址为a1+2*3+3;而不是 a1+2+3;

电闪雷鸣之际 ,当心无杂念,安心渡劫
                                         -18.06.21
2018-07-08 10:42
自学的数学
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:17
帖 子:603
专家分:2418
注 册:2017-11-15
  得分:0 
有一种巧妙办法可以满足楼主的愿望:
程序代码:
#include<stdio.h>
#include<stdlib.h>
int main()
{
    int *p,n,m,i,j,x=0,y;
    printf("输入魔方的阶数:");
    scanf("%d%d",&n,&m);
    y=m/2;
    p=(int *)malloc(sizeof(int)*n*m);
    for(i=0;i<n;i++)
    {
        for(j=0;j<m;j++)
        {
            *(p+i+j)=0;
            printf("%3d",*(p+i+j));
        }
        printf("\n");
    }
    *(p+x+y)=1;
    printf("\n\n");
    for(x=0;x<n;x++)
    {
        for(y=0;y<1;y++)
            printf("%3d",*(p+x+y));
        //printf("\n");
    }
    printf("\n");
    for(x=1;x<n;x++)
    {
        for(y=0;y<m;y++)
            printf("%3d",0);
        printf("\n");
    }
  return 0;
}
2018-07-08 12:06







关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.069786 second(s), 9 queries.
Copyright©2004-2018, BCCN.NET, All Rights Reserved