题解数组名

文章详细解释了C语言中sizeof运算在处理数组名时的特殊情况,区分了数组大小、首元素地址和指针概念,通过示例展示了不同类型数组的sizeof结果差异。
摘要由CSDN通过智能技术生成

一提到数组名,我们都会想到首元素的地址。但是,有两个例外:
1.sizeof(数组名),这里的sizeof计算的是整个数组的大小;
2.&数组名,这里取地址取出的是整个数组的地址。
好了,那今天就用一些代码题解来更深入地了解数组名。

#include<stdio.h>

int main()
{
    int a[] = { 1,2,3,4 };
    printf("%d\n", sizeof(a));
    printf("%d\n", sizeof(a+0));
    printf("%d\n", sizeof(*a));
    printf("%d\n", sizeof(a+1));
    printf("%d\n", sizeof(a[1]));
    printf("%d\n", sizeof(&a));
    printf("%d\n", sizeof(*&a));
    printf("%d\n", sizeof(&a+1));
    printf("%d\n", sizeof(&a[0]));
    printf("%d\n", sizeof(&a[0]+1));
    return 0;
}

这里先解释一下,sizeof实际上是获取了数据在内存中所占用的存储空间,以字节为单位来计数
1.sizeof(a):这里a就是我们所说的例外中的一个,所以sizeof(a)并且是int整形的表示4*4=16个字节;
2.sizeof(a+0):不是例外中的,所以a是首元素的地址,(a+0)还是首元素的地址,所以sizeof(a+0)计算出是4/8个字节(在x86/x64的环境下);
3.sizeof(*a):不是例外中,所以a是首元素的地址,*a表示第一个元素,所以sizeof(*a)计算出4个字节;
4.sizeof(a+1):不是例外中,所以a是首元素的地址,(a+1)表示第二个元素的地址,所以sizeof(a+1)计算出4/8个字节;
5.sizeof(a[1]):a[1]表示第二个元素,所以sizeof(a[1])计算出4个字节;
6.sizeof(&a):例外之一,&a表示整个数组的地址,所以sizeof(&a)计算出4/8个字节;
7.sizeof(*&a):我们可以有两种解释:
一.取出a的地址后再解引用等价于sizeof(a),所以sizeof(*&a)表示16个字节;
二.&a的类型为int(*)[4]的数组指针,对其解引用就表示4个指针,所以4*4=16个字节;
8./9./10:还是表示地址,所以是4/8个字节;

接下来,再举char类型的例子比较一下:

#include<stdio.h>

int main()
{
	char arr[] = { 'a','b','c','d','e','f' };
	printf("%d\n", sizeof(arr));
	printf("%d\n", sizeof(arr + 0));
	printf("%d\n", sizeof(*arr));
	printf("%d\n", sizeof(arr[1]));
	printf("%d\n", sizeof(&arr));
	printf("%d\n", sizeof(&arr + 1));
	printf("%d\n", sizeof(&arr[0] + 1));
	return 0;
}

1.sizeof(arr):这里计算的是整个数组大小,而且char类型是一个字节,所以一共是6个字节;
2.sizeof(arr+0):不是两个例外之一,表示首元素地址,所以是4/8个字节;
3.sizeof(*arr):不是两个例外之一,表示首元素地址,而且解引用后取出第一个元素所以是1个字节;
4.sizeof(arr[1]):表示第二个元素,所以是1个字节;
5.sizeof(&arr):&arr取出整个数组的地址,但大小还是4/8个字节;
6.sizeof(&arr+1):&arr+1跳过了整个数组,但还是地址,所以大小还是4/8;
7.sizeof(&arr[0]+1):取出第二个元素的地址,只要是地址,大小就还是4/8个字节。

这里就不再过多的举例了,小编觉得再深入就越来越繁琐,越来越难了,指针、数组,数组、指针。。。。哎!好事多磨吧!!!

  • 15
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值