| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 525 人关注过本帖
标题:关于指针数组和数组指针的疑惑
只看楼主 加入收藏
izhu
Rank: 1
等 级:新手上路
帖 子:7
专家分:5
注 册:2012-12-2
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:6 
关于指针数组和数组指针的疑惑
我是一名初学C语言的大一学生,最近学到指针数组和数组指针还有二维数组,二维指针的知识,一开始觉得很困惑,然后就上网看了很多人关于它们的分析,但我发现很多人都没搞懂它们之间的联系和区别,于是,我便在电脑上做了一些小实验再加上自己的分析,于是我得出了这么一个结论:
    教科书上说数组名是一个constant类型的指针,其指向了该数组的首元素,我以这个为正确做了以下分析:
        指针数组是一个数组,数组元素是指针,这个数组的数组名是一个指针,指向了这个数组的首元素,这个元素又是一个指针,所以这个数组名是一个指向指针的指针,所以它是二维指针;
        数组指针是一个指针,其指向了一个数组,而这个数组名又是一个指针,所以数组指针也是一个二级指针;
        二维数组是一个数组,其数组名是一个constant的指向了一维数组的指针,如(a[2][2],a指向了a[0]),而一维数组也是一个指针,所以二维数组也是一个二维指针。
    上面的推论我在电脑上进行了验证发现都是可以的,主要验证方法是定义了一个指针数组,一个数组指针,一个二维数组,二维指针,然后通过 *( *( x + i ) + j )的形式去访问发现都是可行的。但是当我想把数组指针的变量名,或者是二维数组的数组名当做实参传递给 函数fun( int **p )时发现编译报错,这时我的疑惑就来了:既然数组指针和二维数组都是二维指针,那为什么不能传递呢?是不是因为我上面的分析有错误??那错在哪儿呢?希望有大神可以帮助我解决这个疑惑?谢谢
搜索更多相关主题的帖子: 大一学生 教科书 C语言 
2012-12-05 12:11
小小战士
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:1
帖 子:569
专家分:1313
注 册:2012-11-3
收藏
得分:10 
分析是有一点问题,二维指针和数组还是有区别的毕竟二维指针不是数组,我看你还是不会传二维数组

二维数组的传递分为下面几种:
第一种:
fun(int p[2][3]) {}   //这种是将形参的各维数都标清楚,实现实参数组元素与形参数组元素一一对应
main()
{  int num[2][3]={1,2,3,4,5,6};  fun(num);  }
第二种:
fun(int p[][3]) {}   //这种是将一维大小省略(行数省略),二维大小标清楚,系统自动匹配个元素的对应关系,达到一一对应
main()
{  int num[2][3]={1,2,3,4,5,6};  fun(num);  }
第三种:
注:可省略const
fun(const int m,const int n,int p[m][n]) {}   //这种是通过传递各维大小来确定形参数组大小(p不能放在m,n前面编译器支持C99,自己想),达到实参数组元素与形参数组元素一一对应
main()
{  int num[2][3]={1,2,3,4,5,6};  fun(2,3,num);  }

以上三种都可以

但就是不能fun(int **p),因为二维指针在有些编译器下是不能当做数组来用的,即使能当做数组来用,那么数组各维都不确定,也就是数组大小不确定,这种声明是错误的,必须至少确定第二维的大小

[ 本帖最后由 小小战士 于 2012-12-5 14:24 编辑 ]

小小战士,战士中的战斗机!
2012-12-05 13:33
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9007
专家分:53942
注 册:2011-1-18
收藏
得分:10 
教科书上说数组名是一个constant类型的指针
------ 劣质书害人呀

数组可以隐式降阶为指针,不等于说数组是指针
2012-12-05 14:10
izhu
Rank: 1
等 级:新手上路
帖 子:7
专家分:5
注 册:2012-12-2
收藏
得分:0 
回复 2楼 小小战士
谢谢你关于二维数组传递的讲解,让我明白了该怎么向函数里传递二维数组!!前面你说的m,n要放在p前面是因为要事先告诉编译器要分配多大内存是吗?
2012-12-05 19:52
izhu
Rank: 1
等 级:新手上路
帖 子:7
专家分:5
注 册:2012-12-2
收藏
得分:0 
回复 3楼 rjsp
嗯嗯,不过我想知道什么叫做隐式降阶??还有就是我们的教科书是“C大学教程 C HOW TO PROGRAM 第四版”,其原话是“...An array name can be thought of as a constant pointer...Since the array name is a pointer to the first element of the array...”我想它是考虑到初学者对于这两者的理解不能很深入所以才这么说的吧,感觉这本教材其他各方面还是蛮不错的,其实我在做实验的时候就发现了,在VS里数组和指针其实不是同一类型的.......
2012-12-05 19:59
小小战士
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:1
帖 子:569
专家分:1313
注 册:2012-11-3
收藏
得分:0 
回复 4楼 izhu
p不能放在m,n前面编译器支持C99
首先,你要确定你的编译器支持C99标准,因为C98标准不支持变长数组p[m][n]这种声明方式
其次,m,n放在p[m][n]前面,是因为调用函数参数的识别是从左到右依次识别。由于二维数组声明时要明确各维大小,即p[m][n]的声明依赖于m和n的声明,否则就会报错

小小战士,战士中的战斗机!
2012-12-05 20:03
izhu
Rank: 1
等 级:新手上路
帖 子:7
专家分:5
注 册:2012-12-2
收藏
得分:0 
回复 6楼 小小战士
嗯嗯,谢谢了,我发现我的编译器是不支持变长数组长度的声明的。
2012-12-06 11:24
快速回复:关于指针数组和数组指针的疑惑
数据加载中...
 
   



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

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