我们都知道数组名是首元素的地址,但是在某些特殊情况下数组名是代表整个元素的地址。
(1)当&数组名的时候便是代表整个数组名。比如 &arr。
(2) 当数组名单独放在sizeof内部的时候便是代表整个数组。
看一段代码:
int main()
{
int a[] = { 1,2,3,4 };
printf("%d\n", sizeof(a));//16
printf("%d\n", sizeof(a + 0));//4/8 个字节
printf("%d\n", sizeof(*a));//4
printf("%d\n", sizeof(a + 1));//4/8
printf("%d\n", sizeof(a[1]));//4
printf("%d\n", sizeof(&a));//4/8
printf("%d\n", sizeof(*&a));//16
printf("%d\n", sizeof(&a + 1));//4/8
printf("%d\n", sizeof(&a[0]));//取出首元素的地址 4/8
printf("%d\n", sizeof(&a[0] + 1));//第二个元素的地址4/8
return 0;
}
sizeof(a)就是数组名单独放在sizeof内部,计算的数组总大小,单位是字节
sizeof(a+0)a是数组名没有单独放在sizeof内部代表首元素地址加0还是首元素的地址 大小是4或者8个字节。
sizeof(*a)a是数组名没有单独放在sizeof内部代表首元素地址其中*是解引用 代表首元素 大小是4个字节。
sizeof(a+1) a是数组名没有单独放在sizeof内部代表首元素地址加1代表a[1]的地址 大小是4个字节。
sizeof(a[1])同上。
sizeof(&a)&a代表整个数组的地址,但是也还是个指针 所以大小为4/8个字节。
sizeof(*&a)&a代表整个数组的地址,*是解引用 相当于*和&抵消 变成sizeof(a)整个数组大小 是16个字节。
sizeof(&a+1)&a代表整个数组的地址,加1代表跳过一个数组,但还是个指针,大小为4/8个字节。
sizeof(&a[0])&a[0]是a[0]的地址 ,大小为4/8个字节。
sizeof(&a[0]+1)其代表的是a[1]的地址,大小为4/8个字节。
相信你们已经初步理解一维数组和开头说的两条准则了。
接下来来挑战一下二维数组。
在平常中我们想象下的二维数组是成表列形式排列但是在内存中地址却是线性的。
我们来看一张图就可以懂了:
上代码:
int main()
{
int a[3][4] = { 1,2,3,4,5,6,7,8,9,10,11,12 };
printf("%d\n", sizeof(a));//48
printf("%d\n", sizeof(a[0][0]));//4
printf("%d\n", sizeof(a[0]));//16
printf("%d\n", sizeof(a[0] + 1));//4
printf("%d\n", sizeof(*(a[0] + 1)));//a[0][1] 大小是:4个字节
printf("%d\n", sizeof(a + 1));//
printf("%d\n", sizeof(*(a + 1)));//16
printf("%d\n", sizeof(&a[0] + 1));//4/8
printf("%d\n", sizeof(*(&a[0] + 1)));//16 a[1]
printf("%d\n", sizeof(*a));//16 *a - 就是第一行
printf("%d\n", sizeof(a[3]));//16
return 0;
}
sizeof(a)a单独放在sizeof内部代表整个数组的大小 4*12 48个字节
sizeof(a[0][0])代表首元素 大小为4个字节。
sizeof(a[0])a[0]是第一行地址的数组名 ,你可以想象成一个一维数组 ,其数组名单独放在了sizeof内部,所以计算的是第一行的大小 ,4*4 16个字节。
sizeof(a[0]+1)a[0]是第一行地址的数组名,但是有+1的存在没有单独放 所以代表的是a[0][0]的地址,+1就是a[0][1]的地址,大小为4或8个字节。
sizeof(*(a[0]+1))(a[0]+1)同上,*是解引用所以是a[0][1]元素的大小,大小4个字节。
sizeof(a+1)a没有单独放在sizeof内部所以a代表的是第一行数组(相当二维降一维)+1代表是第二行数组 大小16个字节。
sizeof(*(a+1))*(a+1)相当于a[1]第二行数组,所以大小为16字节;
sizeof(&a[0]+1)相当于取出第一行地址 再加1 指向第二行地址 ,还是个指针,所以是4或者8个字节。
sizeof(*(&a[0] + 1)) &a[0]是第一行地址+1是第二行地址 再解引用,相当于a[1],大小为16个字节。
sizeof(*a) *a -- *(a+0) -- a[0] 大小是16个字节。
sizeof(a[3])有人会说 越界访问 , 但其实sizeof不在乎,根据a[0] a[1] a[2] 推断是 16个字节。
好了 这期分享就到这里啦