| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3596 人关注过本帖, 3 人收藏
标题:鉴定你有没学会数组
只看楼主 加入收藏
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
收藏
得分:0 
Orz,还带改题目的……怎么可以这样……反正答案就是那样,先赋给一个p然后XXX……

专心编程………
飞燕算法初级群:3996098
我的Blog
2008-05-11 14:14
中学者
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:20
帖 子:3554
专家分:80
注 册:2007-9-14
收藏
得分:0 
哎,郁闷了,错成那样,有必要补补了.../

樱花大战,  有爱.
2008-05-11 14:47
zhzhdwy
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2008-4-19
收藏
得分:0 
有没有哪位大大给个讲解呀
理解起来比较困难咧
2008-05-11 17:42
windk
Rank: 1
来 自:北京联合大学
等 级:新手上路
帖 子:43
专家分:0
注 册:2008-5-4
收藏
得分:0 
详解StarWing83的初级,争取以后把中级和高级也搞定。希望对那些看不懂,不会做的朋友有所帮助,也希望

各位大侠不吝赐教,纠正我的错误~
首先是初级班,能指出本组表达式的值的朋友,对数组有了初步的了解:
    1.(a+1)[2]
    2.(a-1)[1]
    3.(*a)[a]
    4.(&a)[0][1]
    5.(&a)[1]-a
首先引入两个概念便于我这样的菜鸟理解:
1    &:取地址运算符。
    *:指针运算符,取其指向内容。

2    举几个例子来说明&和*的用法:
    a是数组首个元素的地址;
    a[1]在运算的时候首先转换成:*(a+1);
    推广一下:a[i]恒等于*(a+i);
    &a[0]=a 对数组a的第一个元素区地址,所以等于a;
下面开始:
(a+1)[2]
我们把(a+1)看成k,上式等于 k[2];
k[2] 恒等于 *(k+2);
我们再把 k 换成 a+1 得到 *(a+3)
*(a+3) 恒等于 a[3]
a[3]= 4
第二个
(a-1)[1]
同理
(a-1)[1] ==>*(a+0)==>a[0]=1
第三个
(*a)[a]
还是利用 a[i] 恒等于 *(a+i)
k=*a,上式等于k[a];k[a]==>*(k+a)
把k换成*a, *(*a+a); *a=a[0];a[0]=1
*(*a+a) =*(a+1);*(a+1)=a[1]=2;
请教StarWing83的时候,他说 [] 是个二目运算符,我问:二目运算符又怎么啦?他说:二目运算符有交换律
如:
a[i]=i[a]
那么上式
(*a)[a] 等于 a[*a];*a = a[0]=1;故a[*a]=a[1]=2;

第四个
(&a)[0][1]
(&a)[0][1]
1 这个不是二维数组。为什么?(因为,如果这个是二维数组,因为你没有定义二维数组,那么你不可能编译

正确对吧。但是我们可以正确编译。)
2 a是地址,&是区地址的符号,也就是说&a是对地址取地址,怎么对地址取地址?
诧异吧?我用vc++6,c-free编译,结论是 &a 的值等于 a的的值,a的值也就是数组首个元素的地址。为什么会

这样??(正在想。。。望高手指点)。
解决了&a的问题,下面开始解题:
这个是8楼的解法:(&a)[0][1]=>(*(&a +0))[1]=a[1];
也就还是利用 a[i]=*(a+i);把 &a看成整体,(&a)[0][1]==>(*(&a +0))[1]=a[1];

最后一个:
这个不太好理解。
(&a)[1]-a
还是根据基本定理:a[i]=*(a+i)
(&a)[1]-a ==>*(&a+1)-a
上一题提到了,&a 的值 等于a;大家切莫以为&a 就完全等于a;他们不相等的,只不过是值相等。
&a 在这里其实是把a[10]这个数组,变成一个元素,类似于二维数组a[3][2],在二维数组a[3][2]里,a[3]表示
的是第三行首个元素的地址,即a[3] = *(a+3)+0。&a[3]表示的是第三行地址,即&a[3]=*(&a+3)==>a+3这个地
址包含了第三行的两个元素。
上边的概念介绍得比较简单不是很清楚,建议大家看看书,会比较清楚。
回到 (&a)[1]-a ==>*(&a+1)-a 这里的&a理解为一个元素,他的值是a[0]的地址,此时 &a + 1 还是地址但是已经不是a[10],而是这个后面的地址,我们知道,地址和地址减是这两个地址之间的元素个数,a[10]后面的地址,减a[10]的首地址也就是a[0],那不就是a[10]的元素个数吗?
不信你把上边int a[10]={1,2,3,4,5,6,7,8,9,10};改成一个a[12],最后那题就等于12。
总算写完了。我是新手,很多地方理解的不是很好,或者自己理解了不知道如何表达出来。还是这句话希望大家不吝赐教。

[[it] 本帖最后由 windk 于 2008-5-13 19:25 编辑 [/it]]
2008-05-13 19:23
zhuwei168
Rank: 1
来 自:东软信息学院
等 级:新手上路
帖 子:180
专家分:0
注 册:2008-2-13
收藏
得分:0 
貌似我数组还是初级的
好多与只指针的都糊涂了
2008-05-14 18:22
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
收藏
得分:0 
嘿嘿,谢谢windk了哈~~~~都可以这么理解,虽然没有涉及到核心的内容~~~不过,能老妪可解是最好的!!

专心编程………
飞燕算法初级群:3996098
我的Blog
2008-05-14 21:46
qinxinhai
Rank: 1
来 自:湖南长沙
等 级:新手上路
帖 子:237
专家分:0
注 册:2008-4-27
收藏
得分:0 
原来我连老妪都不如!
感觉看别人的多了!反而更迷糊!

我秀我自己
2008-05-14 22:42
yxwsbobo
Rank: 5Rank: 5
等 级:职业侠客
帖 子:345
专家分:306
注 册:2007-10-29
收藏
得分:0 
凑热闹  热闹````

二目运算符有交换律  哎呀呀 这么说可会害死人的
-> . 都是二目 交换了可是会出问题的
&& || 二目  交换了一样可能出现问题
不过数组的交换 确实有点变态

int(*)[4] 是数据类型,如果申请变量的话就是
int(*temp)[4]
很熟悉吧! 就是指向int 的数组指针 详细点:
首先是一个指针,一个指向数组的指针,一个指向int类型数组的指针,一个指向int类型数组大小为4的指针  OK 考的就是这个 其他几个大同小异,细心点就不会错了

高级班
函数接受的都是地址,既然是地址那怎么传都没问题,难点在于怎么用
所以要明白 int(&)[4]类型
既然是类型,就有这个类型的变量:
int(&temp)[4];
首先 是一个引用,是一个int类型的数组的引用,所以应该传递一个int类型的大小为4的数组

int *&
又是一个奇怪的类型,申请变量格式为
int *&temp;
首先是一个引用,是一个int类型的指针的引用,所以需要传递一个int类型的指针变量


弄清楚优先级,弄清楚变量和地址的关系 就OK了

How are you 怎么是你?
How old are you   怎么老是你?
2008-05-15 21:38
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
收藏
得分:0 
我在QQ上就已经声明过了,二目操作符这个观点不关我的事……我告诉他的是索引操作符有交换律,没想到……Orz

专心编程………
飞燕算法初级群:3996098
我的Blog
2008-05-16 19:16
快速回复:鉴定你有没学会数组
数据加载中...
 
   



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

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