数组名是什么?
#includeint main() { int arr[]={1,2,3,4,5,6,7}; printf("%pn",arr); printf("%pn",&arr[0]); printf("%dn",*arr); }
我们打印分别打印arr,&arr[0]的地址,再打印解引用*arr的值。
结论:数组名就是数组第一个元素的地址(有两个例外)
1:sizeof(数组名),计算整个数组的大小,在sizeof内单独放一个数组名表示整个数组
#includeint main() { int arr[]={1,2,3,4,5,6,7}; int sz = sizeof(arr)/sizeof(arr[0]); printf("%dn",sz); }
此时若arr表示数组首元素的地址,那么结果sz应该等于4/4=1.
可见此处arr在sizeof内代表整个数组用于被计算数组大小
2:&arr,表示取整个数组的地址,&arr,数组名表示整个数组
#includeint main() { int arr[]={1,2,3,4,5,6,7}; printf("%pn",arr); printf("%pn",&arr[0]); printf("%pn",&arr); }
这时就出现了三次打印结果都是一样的情况
如何说明&arr是整个数组的地址(数组地址从0x16fdff3b0开始)
为了区别这个问题我们尝试运行一下代码
#includeint main() { int arr[]={1,2,3,4,5,6,7}; printf("%pn",arr+1); printf("%pn",&arr[0+1]); printf("%pn",&arr+1); }
分别打印arr+1,&arr[0+1],&arr+1的地址
结果如下
这里科普一下十六进制
我们熟悉的十进制0~9,逢十进一
十六进制0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f 逢十六进一
第二次打印的前两行数据一样,都代表第二个元素的地址,与第一次对比相差4(一个元素所占的字节大小)
第三行arr+1的地址0x16fdff3cc与0x16fdff3b0相差(b-c)16+(c-0)12=16+12=28
为什么等于28这个数呢?不妨仔细观察数组,数组一共包含7个元素,28刚好是4*7的结果
所以可证&arr为整个数组的地址



