| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 818 人关注过本帖
标题:求教指针问题
只看楼主 加入收藏
胡靖丽
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2009-10-22
结帖率:0
收藏
已结贴  问题点数:20 回复次数:11 
求教指针问题
main()
{int a[3][2]={0},(*ptr)[2],i,j;
 for(i=0;i<2;i++)  {ptr=a+i;scanf("%d",*ptr);ptr++}
 for(i=0;i<3;i++)  
  {for(j=0;j<2;j++)  printf("%2d",a[i][j]);
   printf("\n");
  }
}

请问第二行的(*ptr)[2]到底是指向哪里?

还有这个
main()
{  int a[][3]={{1,2,3},{4,5,6}};(*pa)[3],i;
   pa=a;
   for(i=0;i<3;i++)
    if(i<2)  pa[1][i]=pa[1][i]-1;
    else pa[1][i]=1;
    printf("%d\n",a[0][1]+a[1][1]+a[1][2]);
}

这里第二行的(*pa)[3]又是指向哪里?
非常感谢!!!
搜索更多相关主题的帖子: 指针 
2009-10-22 17:33
UserYuH
Rank: 12Rank: 12Rank: 12
来 自:毅华
等 级:火箭侠
威 望:8
帖 子:720
专家分:3300
注 册:2009-8-10
收藏
得分:3 
  
(*ptr)[2]指向:a[1][0]
(*ptr)[2]可以看作:*((*ptr)+2),ptr指向a数组首地址,(*ptr)+2是首地址移动2位指到a[1][0]
 
(*pa)[3]指向:a[1][0]  
(*pa)[3]可以看作:*((*pa)+3),pa指向a数组首地址,(*pa)+3是首地址移动3位指到a[1][0]

努力—前进—变老—退休—入土
2009-10-22 18:24
fudawei000
Rank: 1
等 级:新手上路
帖 子:10
专家分:4
注 册:2009-9-26
收藏
得分:3 
请问楼上的,我觉得(*ptr)[2]指向:a[2][0]
(*ptr)[2]是:**(ptr+2),是将首地址移动2位到a[2][0]
,不知道对吗????
2009-10-22 20:34
刘暮哲
Rank: 2
来 自:江苏
等 级:论坛游民
帖 子:75
专家分:83
注 册:2009-9-25
收藏
得分:3 
我也有疑惑  请UserYuH详解 呵呵

做最好的自己
2009-10-22 20:49
刘暮哲
Rank: 2
来 自:江苏
等 级:论坛游民
帖 子:75
专家分:83
注 册:2009-9-25
收藏
得分:0 
(*ptr)[2]指向:a[1][0]  
(*ptr)[2]可以看作:*((*ptr)+2),ptr指向a数组首地址,(*ptr)+2是首地址移动2位指到a[1][0]  
 
(*pa)[3]指向:a[1][0]   
(*pa)[3]可以看作:*((*pa)+3),pa指向a数组首地址,(*pa)+3是首地址移动3位指到a[1][0]
那我改成
(*ptr)[3]指向:a[1][0]  
(*ptr)[3]可以看作:*((*ptr)+3),ptr指向a数组首地址,(*ptr)+3是首地址移动2位指到a[1][1]  这样貌似运行不了 ????

(*pa)[3]指向:a[1][0]   
(*pa)[3]可以看作:*((*pa)+3),pa指向a数组首地址,(*pa)+3是首地址移动3位指到a[1][0]

做最好的自己
2009-10-22 21:02
UserYuH
Rank: 12Rank: 12Rank: 12
来 自:毅华
等 级:火箭侠
威 望:8
帖 子:720
专家分:3300
注 册:2009-8-10
收藏
得分:0 
要自己写代码懂怎么测试,试出的结果要是想不通再改,再试。
给这代码测试:
程序代码:
int main(void) 
{  int a[][3]={{11,12,13},{14,15,16}},(*pa)[3],i; 
   pa=a; 
   for(i=0;i<6;i++) 
     { 
      printf("*((*pa)+%d)=%d\t",i,*((*pa)+i)); 
      printf("(*pa)[%d]=%d\n",i,(*pa)[i]); 
     } 
}

努力—前进—变老—退休—入土
2009-10-22 21:19
我菜119
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
帖 子:938
专家分:1756
注 册:2009-10-17
收藏
得分:3 
(*ptr)[2]是一个行指针,它所表示的是每一行中有两个元素,这个知识又要涉及到二维数组的知识,建议你好好的看看关于二维数组的指针知识!


昨天因为有事情,没有好好的解释一下关于二维数组的知识,今天特来补充一下!

对于二维数组的元素,我们有两种方法来输入其中的元素,一种就是通过对行与列的下标控制来实现,这种方法不需要用指针就可以实现!当然我想说的是通过二维数组指针来实现!

对于a[2][4];这个数组,我们可以这样来看它,就是我们可以把它当做一维数组来处理,怎么回事呢?
我们可以把它看做是由两个一维数组a[0]与a[1]组成的。其中在每一个这样的一维数组中储存了四个元素,也就是说其实在a[0],a[1]中储存了四个元素,所以我们可以通过对一维数组的操作来实现对二维数组的操作!
这又是怎么回事呢?
先讲解一下关于二维数组的指针式怎么一回事吧!
上面我们把二维数组看做是一维数组来处理,其实真正意义上的确不是的,这怎么越听越糊涂吧?呵呵!
上面的一维数组只是一个指向二维数组的指针,比如:a[0]=&a[0][0];也就是说一维数组是一个指向二维数组每一行的第一个元素的地址,同样a[1]则是指向a[1][0]的地址的指针,看到这里不知道你是否有一点“山重水复疑无路,柳暗花明又一天”的感觉?
如果还是不太明白的话,那下面的解释你应该会有点明白吧!
先看一下下面的这个程序的一部分:int a[2][4],*p;p=a;这里的p=a不是我们想像的指向a[0][0]的地址的指针,p指向的是一维数组a[0]的地址,而一维数组的指针才是指向二维数组的地址的,这个一定要搞清楚了!那么如果我那么要对p进行操作的话,比如:p+1;是什么呢?我刚才已经说了,p指向的是一维数组的地址,因此p+1当然指的是a[1]的地址呗!那么怎么才能够实现对二维数组的操作呢?别着急。。。
这就需要我们定义一个行指针来实现了!也就是改帖子里的那个(*ptr)[2]了,我已经讲过它表示的是每一个一维数组里的元素个数,比如我现在想对a[1][2]进行指针操作呢?我们这时可以这样:*(*(p+1)+2)就表示的是a[1][2]这个元素了!

好了,就讲这么多吧!打字挺累的喔!呵呵!


[ 本帖最后由 我菜119 于 2009-10-23 16:45 编辑 ]

愿用余生致力编程
2009-10-22 22:06
fudawei000
Rank: 1
等 级:新手上路
帖 子:10
专家分:4
注 册:2009-9-26
收藏
得分:0 
楼上说的我看明白了
但是还是不明白User说的,
我是不是可以这样理解帖子写的
int a[3][2]={0}
就是定义了三行,每行中有2个元素。那我定义p=a,是不是**p指向a[0][0],*(*p+1)就是指向a[0][1],**(p+1)就是指向a[1][0],
*((*p+1)+1)就是指向a[1][1]
那为什么我不能说*ptr[2]相当于**(ptr+2),就是把ptr移动两个地址,指向a[2][0]
既然楼上说可以把二维数组看成两个一维数组a[0]与a[1]组成的。其中在每一个这样的一维数组中储存了四个元素
那么帖子中的就可以说成是三个一维数组啊,
可是为什么说帖子中的是指向a[1][0]啊,a[1][0]我可以看成是**(ptr+1)吗
这就是我不明白的地方。请帮我解释一下。
2009-10-25 15:06
chiZ
Rank: 2
来 自:paradise
等 级:论坛游民
帖 子:27
专家分:99
注 册:2009-10-25
收藏
得分:3 
it seems that you know the two dimensional array! i use row and col to represent the index of table[row][col]. The two level pointer is actually same as the two dimensional array. the difference is that you can use dynamic allocation for the pointer.
table[row][col] is equvalent to *(*(table+row)+col)!! so for you question, a[1][0]==**(ptr+1).
2009-10-25 16:42
fudawei000
Rank: 1
等 级:新手上路
帖 子:10
专家分:4
注 册:2009-9-26
收藏
得分:0 
对啦
int *ptr
ptr=a
(*ptr)[2]有什么

int (*ptr)[2]有什么区别吗??
2009-10-26 21:35
快速回复:求教指针问题
数据加载中...
 
   



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

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