鉴定你有没学会数组
发现今天(昨天?)有人发了这个帖子。所以我也来凑凑热闹。题目中的数组a的定义为:
int a[10]={1,2,3,4,5,6,7,8,9,10};
首先是初级班,能指出本组表达式的[bo]值[/bo]的朋友,对数组有了初步的了解:
1.(a+1)[2]
2.(a-1)[1]
3.(*a)[a]
4.(&a)[0][1]
5.(&a)[1]-a
然后是中级班,能指出本组表达式的[bo]值[/bo]的朋友,对数组内存分布以及索引运算符的特点有了较深了解:
6.((int(*)[4])a)[1][2]
7.(*((int(*)[4])a+1))[1]
8.((int(*)[4])a+1)[1][1]
9.(*(int(*)[4])a)[2]
10.(*a)[(int(*)[4])a][((int(*)[4])a)[0][2]]
最后是高级班,能够写出[bo]将a传给下面函数的正确表达式[/bo]的朋友,对数组和指针的区别有了较深了解:
11.void func1(int*);
12.void func2(int(&)[4]);
13.void func3(int*&);
14.void func4(int(&)[3][3]);
以上所有表达式,都在GCC+VC9下编译测试通过。少数可能会有标准化的问题:C/C++标准规定指向数组外的指针其值未定义,比如对于a,a+10的值未定义。因为假设a的地址刚刚好是内存最后十个int的位置,a+10就会因为地址溢出而等于0了——虽然标准承诺0不会分配给任何变量。这里只是说明未定义的情况下任何可能都会发生而已。但是在实际使用中,大家一定不会写出这种代码。我们假设不会发生上述情况。只要能说出值的由来,就算通过。
为了以示区别,函数名字后加入数字。
大家不妨跟帖给出自己的答案~~~~
[[it] 本帖最后由 StarWing83 于 2008-5-10 08:59 编辑 [/it]]