| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 471 人关注过本帖, 1 人收藏
标题:C编程问题
只看楼主 加入收藏
hdshdzh
Rank: 2
等 级:论坛游民
帖 子:77
专家分:11
注 册:2010-5-13
结帖率:92.31%
收藏(1)
已结贴  问题点数:12 回复次数:7 
C编程问题
#include<stdio.h>
main()
{
int a[3][4]={{21,12,23,14},{15,36,17,48},{19,70,81,22}};
int *p=a[0],i,j;
scanf("%d,%d\n",&i,&j);
if((i>=0&&i<3)&&(j>=0&&j<=4))
printf("\n%4d",*(p+i*4+j));
else
printf("\n");
}谁帮我分析一下这个不是很理解int *p=a[0]    *(p+i*4+j)
2010-05-15 22:33
灰色代言
该用户已被删除
收藏
得分:1 
提示: 作者被禁止或删除 内容自动屏蔽
2010-05-16 00:45
lxg1123
Rank: 2
等 级:论坛游民
帖 子:31
专家分:18
注 册:2010-5-11
收藏
得分:0 
偶没学到指针,不过先看看吧
2010-05-16 01:03
lintaoyn
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:4
帖 子:606
专家分:2499
注 册:2009-4-8
收藏
得分:0 
你自己先写一个动态申请二维数组的程序。(申请一个元素类型为指针的一维数组,然后该数组的每个元素再接受动态分配返回回来的地址。)虽然和内置数组不一样,但可以帮你理解你提的问题。

迭代的是人,递归的是神。
2010-05-16 08:36
hdshdzh
Rank: 2
等 级:论坛游民
帖 子:77
专家分:11
注 册:2010-5-13
收藏
得分:0 
*(p+i*4+j)   也可以学成*(*(a+i)+j)但是我不理解*4+j
2010-05-16 09:15
lintaoyn
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:4
帖 子:606
专家分:2499
注 册:2009-4-8
收藏
得分:5 
回复 5楼 hdshdzh
* * * * * *
* * * p * *
* * * * * *
int a[3][6];

p的位置为按坐标来看是[1][3];你要是一行一行的数就是1*6+3;

迭代的是人,递归的是神。
2010-05-16 09:57
canshui
Rank: 2
等 级:论坛游民
帖 子:8
专家分:10
注 册:2010-4-25
收藏
得分:6 
int *p=a[0];  是把数组的第一行的地址给p,它的值也就是起始地址
*(p+i*4+j) ; 表示从数组起始地址开始向后偏移多少个数,
对于a[i][j]来说,它是数组的第i行,第j列的数,它的位置相对于第一个数,是第(i*4+j)个数(可以理解吧);p就从开始向后偏移(i*4+j)多位后,就指向了a[i][j]的地址,*(p+i*4+j),也就是该地址上保存的内容,即a[i][j]的值;

*(*(a+i)+j)与*(p+i*4+j);结果是一样的,但由来还是有差异的;
*(*(a+i)+j);它表示先找到数组第i行的起始地址,如&a[0],&a[1],再从该起始地址开始,向后偏移j个地址,也就得到a[i][j]的地址
*(a+i)+j;再用*(*(a+i)+j)表示a[i][j]的值
2010-05-16 10:31
冥卫
Rank: 8Rank: 8
来 自:深山老林
等 级:蝙蝠侠
帖 子:280
专家分:772
注 册:2010-4-20
收藏
得分:0 
帮忙顶顶
2010-05-16 11:12
快速回复:C编程问题
数据加载中...
 
   



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

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