| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1662 人关注过本帖
标题:为什么普通指针指向二维数组,直接取内容可以得元素值.
只看楼主 加入收藏
默默学习
Rank: 4
等 级:业余侠客
帖 子:134
专家分:200
注 册:2010-6-22
结帖率:84.21%
收藏
已结贴  问题点数:20 回复次数:9 
为什么普通指针指向二维数组,直接取内容可以得元素值.
#include "stdio.h"
void main()
{
    int a[3][2]={{2,4},{5,1},{7,9}};
    int *p=a;
    int (*sp)[2]=a;
    printf("%d",*p);//普通指针指向的二维数组,直接把结果输出了。
    printf("%d",**p);//数组指针则存在一个行指针地址,取两次才行。
}
我是这样理解的:二维数组名a 难道不是数组名吗,那它是不是就应该存在*a或a[0],a[1],a[2]的首行地址?
既然这样,我同样是以指针来接。为什么普通指针只用取一次内容呢?,难道不是同一个二维数组名吗?

小弟新手,有些疑问不解,还望各位多多指教!
搜索更多相关主题的帖子: 元素 
2011-03-05 12:40
baobaoisme
Rank: 7Rank: 7Rank: 7
来 自:AVATAR
等 级:黑侠
帖 子:260
专家分:506
注 册:2010-7-9
收藏
得分:2 
int a[3][2]={{2,4},{5,1},{7,9}};
    int *p=a;//对这句编译通过持怀疑态度
2011-03-05 13:25
liangjinchao
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:376
专家分:697
注 册:2010-11-8
收藏
得分:0 
楼主你能说清楚你的程序想实现怎样的功能吗?我看你这程序编译是不会通过的!

因为有了因为,所以有了所以,既然已成既然,何必再说何必
2011-03-05 13:29
犬虫门心
Rank: 8Rank: 8
来 自:西安
等 级:蝙蝠侠
帖 子:209
专家分:753
注 册:2011-1-25
收藏
得分:0 
既然这样,我同样是以指针来。我看不懂这个字的意思。
“为什么普通指针只用取一次内容呢?”这句话又是什么意思呢?
能不能把问题问得清晰些呢?

当一名对得起学生学费的老师,一直是我的目标!我会更努力的!
2011-03-05 15:30
liangjinchao
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:376
专家分:697
注 册:2010-11-8
收藏
得分:1 
回复 4楼 犬虫门心
老师,能+你QQ吗?

因为有了因为,所以有了所以,既然已成既然,何必再说何必
2011-03-05 15:36
犬虫门心
Rank: 8Rank: 8
来 自:西安
等 级:蝙蝠侠
帖 子:209
专家分:753
注 册:2011-1-25
收藏
得分:0 
以下是引用liangjinchao在2011-3-5 15:36:46的发言:

老师,能+你QQ吗?
我6:30下课。
5061824

当一名对得起学生学费的老师,一直是我的目标!我会更努力的!
2011-03-05 15:39
丞相杀手
Rank: 6Rank: 6
等 级:侠之大者
帖 子:203
专家分:462
注 册:2011-1-11
收藏
得分:5 
    int *p=a;        //这是声明了一个指针,一个指针对应的就是一个内存地址,*p就可以取到类型为int的内存空间
    int (*sp)[2]=a;  //这句声明了由两个指针组成的一个指针数组,*sp只能取到指向一个指针值的内存空间,而**sp可以取到int类型的内存空间

斗不过疯子,不参与争论。
2011-03-05 16:08
默默学习
Rank: 4
等 级:业余侠客
帖 子:134
专家分:200
注 册:2010-6-22
收藏
得分:0 
我在VC环境下肯定是编译出来了。
但是我不理解,
#include "stdio.h"
void main()
{
    int a[3][2]={{2,4},{5,1},{7,9}};
    int *p=a;
    int (*sp)[2]=a;
    printf("%d",*p);//这句直接输出了2,也就是二维数组的首元素,.
    printf("%d",**p);//若用数组指针,*p表示的是行指针地址吧,**p直接才取出内容。
}
就是简单的说,用一般的指针,指向二维数组,*p怎么直接输出结果了。
而用数组指针(*sp)[2],**p才输出结果.
2011-03-05 18:07
犬虫门心
Rank: 8Rank: 8
来 自:西安
等 级:蝙蝠侠
帖 子:209
专家分:753
注 册:2011-1-25
收藏
得分:0 
以下是引用默默学习在2011-3-5 18:07:52的发言:

我在VC环境下肯定是编译出来了。
但是我不理解,
#include "stdio.h"
void main()
{
    int a[3][2]={{2,4},{5,1},{7,9}};
    int *p=a;
    int (*sp)[2]=a;
    printf("%d",*p);//这句直接输出了2,也就是二维数组的首元素,.
    printf("%d",**p);//若用数组指针,*p表示的是行指针地址吧,**p直接才取出内容。
}
就是简单的说,用一般的指针,指向二维数组,*p怎么直接输出结果了。
而用数组指针(*sp)[2],**p才输出结果.
我也是在VC下编译你的程序的,但是给出了错误提示!
int *p = a;//错在这里!
p的类型与a的类型不匹配。

当一名对得起学生学费的老师,一直是我的目标!我会更努力的!
2011-03-05 18:20
犬虫门心
Rank: 8Rank: 8
来 自:西安
等 级:蝙蝠侠
帖 子:209
专家分:753
注 册:2011-1-25
收藏
得分:12 
以下是引用丞相杀手在2011-3-5 16:08:33的发言:

    int *p=a;        //这是声明了一个指针,一个指针对应的就是一个内存地址,*p就可以取到类型为int的内存空间
    int (*sp)[2]=a;  //这句声明了由两个指针组成的一个指针数组,*sp只能取到指向一个指针值的内存空间,而**sp可以取到int类型的内存空间
请验证下面的输出结果:
printf("%d\n", sizeof(sp));
如果输出结果为8,那么,丞相杀手说的是对的。
如果输出结果为4,那么,sp应该是一个指针变量,而且是一个指向数组的指针变量,通常称作“行指针”
请大家先验证,再结论。

当一名对得起学生学费的老师,一直是我的目标!我会更努力的!
2011-03-05 18:23
快速回复:为什么普通指针指向二维数组,直接取内容可以得元素值.
数据加载中...
 
   



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

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