今天看了这样一道题,我好好研究了一番。题目如下,问第一行输出为0x28ff20,那后面几行的输出是多少?
第二行是a+1的地址,那么a+1很容易计算出来,由于a的类型为int *,所以a+1 = 0x28ff20 + sizeof(int)=0x28ff24,这一行并不难,比较入门。
那么第三行呢,&a,这个怎么理解呢?&a的类型为int(*)[5],应该为指向整个数组a[5]的指针,即&a与a是相等的,虽说值相等,但是它们指向的内容却不同。a的类型为int *,&a的类型为int(*)[5]。这里,大家再好好理解一下。也可以这样,a的类型为int* ,那么&a的类型为int **。
第四行呢,&a+1应该理解为下一个数组的首地址,即&a+1 = 0x28ff20+sizeof(int)*5 = 0x28ff34。
运行结果如下:
有人也许对上面三四行的cout结果还有疑问,不妨我们做一个实验。我们建立一个二维数组a[2][5],由于c/c++的数组均是以行序为主序的,即内存中应该依次存放的是a[0][0]、a[0][1]……a[1][4]。
运行结果如下:
这个时候a的类型是int (*)[5],所以a+1相比于a偏移了sizof(int)*5。我们发现,这个值跟前面求&a+1的偏移量是一致的,我们也就可以理解刚才“下一数组的首地址”这个概念了。