学习型 ASP/PHP/ASP.NET 主机 30元/年全能 ASP/PHP/ASP.NET 主机,支持月付专业 MSSQL 数据库空间,支持月付专业 MySQL 数据库空间,支持月付
 39 1234
发新话题
打印

鉴定你有没学会数组

鉴定你有没学会数组

发现今天(昨天?)有人发了这个帖子。所以我也来凑凑热闹。
题目中的数组a的定义为:
int a[10]={1,2,3,4,5,6,7,8,9,10};
首先是初级班,能指出本组表达式的的朋友,对数组有了初步的了解:
    1.(a+1)[2]
    2.(a-1)[1]
    3.(*a)[a]
    4.(&a)[0][1]
    5.(&a)[1]-a

然后是中级班,能指出本组表达式的的朋友,对数组内存分布以及索引运算符的特点有了较深了解:
    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]]

最后是高级班,能够写出将a传给下面函数的正确表达式的朋友,对数组和指针的区别有了较深了解:
    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不会分配给任何变量。这里只是说明未定义的情况下任何可能都会发生而已。但是在实际使用中,大家一定不会写出这种代码。我们假设不会发生上述情况。只要能说出值的由来,就算通过。
为了以示区别,函数名字后加入数字。
大家不妨跟帖给出自己的答案~~~~

[ 本帖最后由 StarWing83 于 2008-5-10 08:59 编辑 ]

TOP

看看我有没有合格

1.(a+1)[2]          值是4   a的地址+3的值
2.(a-1)[1]            1      a的地址-1再加1
3.(*a)[a]               2     *a值是1也就是a[0]的值,a的值是1
4.(&a)[0][1]              
5.(&a)[1]-a
欢迎长期在线的朋友加入此群:21135958

TOP

11.void func(int*);     传送的是地址
    12.void func(int(&)[4]);      相当于 (*a)[4] 指向二维数组的指针
    13.void func(int*&);          传送的是值..是值传递  运算符是左结合.先取地址..再*指针运算把该地址的值
    14.void func(int(&)[3][3]);   这个好像不清楚

[ 本帖最后由 bianfeng 于 2008-5-10 08:19 编辑 ]
欢迎长期在线的朋友加入此群:21135958

TOP

能够写出正确将a传给下面函数的表达式

比如第一个,答案是func(a);直接将a传给func。LS没理解题意啊……

Orz……是不是我要求太高了……楼上的解释是什么啊……晕了……那些是函数声明啊……有这样解释的么………………

[ 本帖最后由 StarWing83 于 2008-5-10 08:38 编辑 ]
专心编程………
飞燕算法初级群:3996098
我的Blog

TOP

汉...理解错了
欢迎长期在线的朋友加入此群:21135958

TOP

我学了,可是不会。。。。
期待楼主的正解
好好学习
本帖最近评分记录

TOP

正解?你可以自己写程序运行看看啊……
专心编程………
飞燕算法初级群:3996098
我的Blog

TOP

(a-1)[1]==>a[0];
    (*a)[a]==>a[*a]==>a[1];
    (&a)[0][1]=>(*(&a +0))[1]=a[1];
    (&a)[1]-a==>*(&a+1)-a;
学习需要安静。。海盗要重新来过。。

TOP

#include <stdio.h>
void main()
{
    int a[10]={1,2,3,4,5,6,7,8,9,10};
    printf("%d\n",(a+1)[2]);
    printf("%d\n",(a-1)[1]);
    printf("%d\n",(*a)[a]);
    printf("%d\n",(&a)[0][1]);
    printf("%d\n",(&a)[1]-a);    
}
结果
4
1
2
2
10
结论对不对?
(a+1)[2] == a[2+1]
(a-1)[1] == a[1-1]
后边三个还行lz指点
(*a)[a]
(&a)[0][1]
(&a)[1]-a

TOP

sun,最后一个的值是多少?
专心编程………
飞燕算法初级群:3996098
我的Blog

TOP

 39 1234
发新话题