a+1与&a+1

来源:互联网 发布:科鲁兹前氧传感器数据 编辑:程序博客网 时间:2024/04/25 12:04

终于不用担心写的东西涉及公司机密了。

今天做题遇到了二维数组地址计算的问题,之前记的比较混乱,且遇到了&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=5的指针,&a+1表示的是&a的值(首地址)加上sizeof(a)=5*int,因此&a+1指的是a[5]。也就是数组a后下一个地址。

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

0 0
原创粉丝点击