详解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]]