| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2022 人关注过本帖
标题:指针型二维数组,赋值后相互干扰,求解
只看楼主 加入收藏
kfyniriu
Rank: 6Rank: 6
等 级:侠之大者
威 望:9
帖 子:105
专家分:426
注 册: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编辑过]

搜索更多相关主题的帖子: 指针 赋值 int printf for 
2018-07-07 21:27
nosnoy
Rank: 9Rank: 9Rank: 9
来 自:mcu
等 级:贵宾
威 望:14
帖 子:541
专家分:1178
注 册: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 吧

穷举是最暴力的美学
2018-07-07 21:51
kfyniriu
Rank: 6Rank: 6
等 级:侠之大者
威 望:9
帖 子:105
专家分:426
注 册: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: 9Rank: 9Rank: 9
来 自:mcu
等 级:贵宾
威 望:14
帖 子:541
专家分:1178
注 册: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;
}


图片附件: 游客没有浏览图片的权限,请 登录注册

穷举是最暴力的美学
2018-07-07 22:38
nosnoy
Rank: 9Rank: 9Rank: 9
来 自:mcu
等 级:贵宾
威 望:14
帖 子:541
专家分:1178
注 册:2016-9-17
收藏
得分:0 
回复 3楼 kfyniriu
你可以现去看下二维数组的存储方式 然后在用指针替代,有车不开,一定要走路

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


穷举是最暴力的美学
2018-07-07 22:38
自学的数学
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:46
帖 子:967
专家分:4146
注 册:2017-11-15
收藏
得分:0 
在我的机器上运行, scanf("%d-%d",&n,&m);还有问题,改成如下就好了:
 scanf("%d %d",&n,&m);
2018-07-07 23:37
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏
得分:5 
*(p+i*m+j)
2018-07-07 23:44
kfyniriu
Rank: 6Rank: 6
等 级:侠之大者
威 望:9
帖 子:105
专家分:426
注 册:2018-7-6
收藏
得分:0 
回复 5楼 nosnoy
代码修改成指针替代二维数组的方式,怎么修改呢?还望不吝赐教
2018-07-08 09:49
nosnoy
Rank: 9Rank: 9Rank: 9
来 自:mcu
等 级:贵宾
威 望:14
帖 子:541
专家分:1178
注 册:2016-9-17
收藏
得分:0 
回复 8楼 kfyniriu
假设数组为 a[3][4] 那么首地址为 a[0][0]的地址假定为a1     则a[2][3]的地址为a1+2*3+3;而不是 a1+2+3;

穷举是最暴力的美学
2018-07-08 10:42
自学的数学
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:46
帖 子:967
专家分:4146
注 册: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.041775 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved