2015-01-21 回答
问题1:一维数组名与二维数组名含义是不一样的,当然跟你理解的指向行或者列是有一定的偏差的。
对于一维数组,比如int a[4],a代表的是int型的指针,其地址指向a[0],对于二维数组比如a[2][4],a代表的是也是指针,只不过不是简单的int型指针,而是你代码中的数组指针,它与一维数组中指针的区别是:当一维数组名a++时(即步长),指针移动字节数为int型数据所占字节数,但是对于二维数组中a++时,指针移动字节数为列数乘以int型数据所占字节数,即4(代表数组有4列)乘以sizeof(int)。
问题2:先说一下&a代表的意思。假设数组为int a[4]
对于一维数组&a代表的是int型数组指针,它与a的区别是a是int型指针,但是&a代表是int型数组指针,&a的步长为以为数组大小乘以int型数据所占字节数,所以当p = a时,这两个类型不匹配,因为p为int型数组指针,a为简单int型指针,对于表达式p = &a,这个表达式刚好类型匹配,它们的步长都是(4 * sizeof(int))。
问题3:对于int (*p)[4]代表的是int型数组指针,步长是(4 * sizeof(int))。首先说明的是对于第7行程序打印的结果不是a[3]对应的值,这样的操作属于越界(即访问到数组外的内存)。对于(*p)[3]表达式代表*(p + 3),因为p步长为16字节(假设int型数据占4字节),所以*(p + 3)其实访问的是数组首地址加上16乘以3地址处的数据。
问题4:对于二维数组int a[2][4]以及int (*p)[4],因为a与p都是int型数组指针,所以类型匹配,所以对于第6行:p = a即可,如果想输出a[0][3],用printf("%d\n", *(*(p) + 3));即可。对于二维数组而言,存在&a的语句,它同样是数组指针,其步长是行数乘以列数乘以int型所占字节数,对于
int a[2][4],&a的步长为2 * 4 * sizeof(int)。
问题:对于二维数组*score它也是一个指针,并且是个数组指针,如果改成&score以后,虽然都是数组指针,但是步长不一致,编译器会报警告。
希望上述回答对你有一定帮助。