| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 637 人关注过本帖
标题:谁能给我解释解释,我有点懵了。
只看楼主 加入收藏
棉雨
Rank: 5Rank: 5
等 级:职业侠客
帖 子:174
专家分:368
注 册:2011-4-22
结帖率:78.26%
收藏
已结贴  问题点数:20 回复次数:12 
谁能给我解释解释,我有点懵了。
#include<iostream>
using namespace std;
main()
{
          int a[10]={1,2,3,4,5,6,7,8,9,0};
     int b[3][4];
     int (*p)[10];
     p=&a;
     int (*q)[4];
     q=b;     
     for(int i=0;i<10;i++)
     cout<<*(p+i)<<endl;
     cout<<sizeof(p+1)<<endl;
     for(int j=0;j<4;j++)
     cout<<*(q+j)<<endl;
     cout<<sizeof(q)<<endl;        
                                                                                       
}
我想问一下,为什么*(p+1)和*(p+2)相差28,而*(q+1)和*(q+2)却是相差10.
谁能给个详细点的解释,我对指针跟数组的关系不是很清楚。
搜索更多相关主题的帖子: namespace include 
2011-05-29 18:27
lz1091914999
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:四川
等 级:贵宾
威 望:37
帖 子:2011
专家分:5959
注 册:2010-11-1
收藏
得分:2 

My life is brilliant
2011-05-29 18:32
liangjinchao
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:376
专家分:697
注 册:2010-11-8
收藏
得分:8 
在32位windows下,VS2008下的结果!
图片附件: 游客没有浏览图片的权限,请 登录注册

这样应该明了吧?

[ 本帖最后由 liangjinchao 于 2011-5-29 20:39 编辑 ]

因为有了因为,所以有了所以,既然已成既然,何必再说何必
2011-05-29 20:36
laoyang103
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:内蒙古包头
等 级:贵宾
威 望:19
帖 子:3082
专家分:11056
注 册:2010-5-22
收藏
得分:6 
程序代码:
#include<iostream>
using namespace std;
main()
{
          int a[10]={1,2,3,4,5,6,7,8,9,0};
     int b[3][4];
     int (*p)[10];//指向数组的指针
     p=&a;
     int (*q)[4];//同上
     q=b; //b是二级指针   
     for(int i=0;i<10;i++)
     cout<<*(p+i)<<endl;//输出数组每个元素的地址
     cout<<sizeof(p+1)<<endl;//指针当然占四个字节
     for(int j=0;j<4;j++)
     cout<<*(q+j)<<endl;//输出每个一维数组首元素的地址
     cout<<sizeof(q)<<endl;  //32为系统指针一定是四个字节     
                                                                                       
}

                                         
===========深入<----------------->浅出============
2011-05-29 20:45
棉雨
Rank: 5Rank: 5
等 级:职业侠客
帖 子:174
专家分:368
注 册:2011-4-22
收藏
得分:0 
看了还是不明白为什么……
2011-05-29 21:27
liuwh
Rank: 1
等 级:新手上路
帖 子:17
专家分:5
注 册:2011-5-26
收藏
得分:1 
*(p+1)和*(p+2)相差28,而*(q+1)和*(q+2)却是相差10.
??不知道楼主是怎么得出这信息的,*(p+1)和*(p+2)相差应该10,地址相差40,*(q+1)和*(q+2)应该是相差4,地址相差16
2011-05-29 21:43
liuwh
Rank: 1
等 级:新手上路
帖 子:17
专家分:5
注 册:2011-5-26
收藏
得分:1 
举个例子吧,
int* a,*b;
int c[10]={0};

a=c;
b=&c[1]; 这时b比a 大1,b就相当于a+1了,因为 类型是int*,所以每一个是4个字节, 所以地址相差就等于(b-a)*4;

2011-05-29 21:59
棉雨
Rank: 5Rank: 5
等 级:职业侠客
帖 子:174
专家分:368
注 册:2011-4-22
收藏
得分:0 
int (*p)[10];是定义了int(*)[10]类型的指针p,它指向的类型是int[10],用数组a的首地址来初始化它:p=&a;语句cout<<*(p+i)<<endl;//输出数组每个元素的地址,我以为cout<<"*(p+2)-*(p+1)"<<":"<<*(p+2)-*(p+1)<<endl; 这一句的输出结果是4,但却是10。这个是我不明白的地方。还有哦,我定义了一个二维数组int b[3][4],然后用int (*q)[4](类型为int (*)[4],指向的类型为int [4])来指向它:q=b;这一句cout<<"*(q+2)-*(q+1)"<<":"<<*(q+2)-*(q)<<endl;的输出结果却是4.
这是为什么?
2011-05-29 22:08
liuwh
Rank: 1
等 级:新手上路
帖 子:17
专家分:5
注 册:2011-5-26
收藏
得分:0 
我没太懂你想要表达的意思,你可以把长句化短些,
好看些,更容易理解些。
2011-05-29 22:21
liuwh
Rank: 1
等 级:新手上路
帖 子:17
专家分:5
注 册:2011-5-26
收藏
得分:1 
我以为cout<<"*(p+2)-*(p+1)"<<":"<<*(p+2)-*(p+1)<<endl; 这一句的输出结果是4,但却是10
*(p+2)现在是二级指针了指向了int [10]的数组,和*(p+2)和*(p+1)所指向的是相邻的,所以相差了10个int元素,地址相差了40
2011-05-29 22:28
快速回复:谁能给我解释解释,我有点懵了。
数据加载中...
 
   



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

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