数组名 和&数组名的理解

文章详细解释了C语言中数组名在不同情况下的含义,特别是与sizeof运算符结合时的行为。它探讨了一维数组和二维数组的内存布局,以及如何通过指针和解引用操作获取元素或数组的大小。重点在于理解数组名在某些情况下表示整个数组,而在其他情况下表示首元素的地址。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  我们都知道数组名是首元素的地址,但是在某些特殊情况下数组名是代表整个元素的地址。

(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个字节。

  好了 这期分享就到这里啦

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值