终于不用担心写的东西涉及公司机密了。
今天做题遇到了二维数组地址计算的问题,之前记的比较混乱,且遇到了&a+1的情况,这种情况以前没遇到过,在网上查询后终于找到了答案。
http://www.cnblogs.com/auleaf/archive/2011/09/19/2181346.html
相关知识点引用自另外一位的博客,地址见上。
1.数组里a和&a的区别
对于一个数组,a是数组首元素的地址。
&a是整个数组的地址。
虽然a和&a的值一样,但是意义不一样
以上这段看上去还真是晕,平时也不见到用到&a,其实这个问题主要表现在&a+1和a+1上。借用一下auleaf的博客文章,举个栗子。
#include<stdio.h>
int main(void)
{
int a[5]={1,2,3,4,5};
int *ptr=(int *)(&a+1); //&a代表整个数组的地址,+1应该加上sizeof(a)的长度,所以ptr指向a[5]位置处。
printf("%d %d\n",*(a+1),*(ptr-1));//a代表数组首元素的地址,+1应该加上sizeof(a[0]),所以a+1指
向a[1]处。
return 0; //输出是 2 5
a表示的是数组首元素地址,这是一个T=1(首元素是个1位的)指针,因此a+1*int表示的是a[1]的地址。
因此*(a+1)对应的是a[1]=2;*(ptr-1)对应的是a[5-1]=5
值得 注意的是这个过程中还有一个强制类型转换,即&a+1计算出来的地址强制转换成int*型。
牛客网的题目如下
这里涉及了多维数组。对于&a+1而言,仍旧是首地址+整个数组的地址,因此到了数组后一位地址上,下面ptr-1是数组后一位的地址减去1*int(因为ptr是int型的),也就是数组的最后一位,因此是12.
对于a+1而言,数组a认为是一个一位数组,其中每一位都是一个2*3的数组,a+1表示首地址加上a的一个元素的长度,因此是到了a[1],也就是第二层中的第二个括号第一个数字,7.
答案为7,12