今天做题看到很多sizeof(a)、sizeof(&a)、sizeof(&a+1)之类的题,一不小心就把人弄晕了,所以今天就好好把这些整理整理。
开始之前呢分享一个小技巧——数组名只有处于以下两种情况时才代表整个数组:①数组名单独在sizeof内时。② &数组名(如&a)
int a[ ] = {1,2,3,4};
sizeof(a) =16 数组名单独在sizeof内,表示整个数组,一个int型元素4个字节,4*4=16。
sizeof(a+0) =4 此处数组名不是单独在sizeof内,那表示的就是首元素地址,+0,那还是首元素地址,存地址的指针变量大小是四个字节。
sizeof(*a) =4 此处 不是单独在sizeof内,a代表首元素地址,*a就代表的是首元素——‘1’,求首元素大小。
sizeof(a+1) =4 首元素地址加1,那就是第二个元素的地址,还是地址。
sizeof(a[1]) =4 a[1]数组中的第一个元素,整型数据4字节。
sizeof(&a) =4 此处&a就代表整个数组的地址,但是 地址啊,放指针变量里面的,所以还是4字节。
sizeof(*&a) = 16 &a是a的地址,那*&a就代表整个数组了,所以是16字节。
sizeof(&a+1) =4 此处&a代表的是数组a的地址(整个数组),虽然数组地址和数组首元素地址的值是一样的,但代表的意义完全不相同。这里(&a+1),是向后移动16字节(数组a总大小),那么(&a+1)代表的是数组a尾元素后一位的那个元素地址。
sizeof(&a[0]) =4 这就不用说了,取第一个元素地址
sizeof(&a[0]+1) = 4 嗯,第二个元素地址。
求整型数组的还是比较简单的,但要记住这些规则,毕竟后面复杂的多了去了,比如字符型数组啊,字符串啊,二维数组啊,以及strlen对它们操作啊,这些都是面试官爱出的题。一定要弄清楚明白。