C语言中数组名的作用

一维数组

对于一维数组而言,数组名可以表示首元素的地址

#include<stdio.h>

int main()
{
	int arr[10] = { 0 };
	printf("%p\n", arr);
	return 0;
}

但是有两种情况是例外

1. 使用sizeof(数组名),此时的数组名表示整个数组,该函数计算出的结果是数组的长度,单位是字节;

#include<stdio.h>

int main()
{
	int arr[10] = { 0 };
	int sz = sizeof(arr);
	printf("%d\n", sz);
	return 0;
}

2. &数组名,此时的数组名仍然表示整个数组

#include<stdio.h>

int main()
{
	int arr[10];
	// 此处的arr表示的是数组首元素的地址,“arr+1”表示首元素的下一次元素的地址
	printf("%p\n", arr);
	printf("%p\n", arr + 1);
	printf("================\n");
	// 此处的arr前面有 “&” ,arr表示的是整个数组的地址,
    // 此时“arr+1”表示整个数组的下一个元素的地址
	printf("%p\n", &arr);
	printf("%p\n", &arr + 1);

	return 0;
}

上图中,&arr表示整个数组的地址,&arr+1则表示整个数组的地址+1,从我们打印出来的结果来看,0x00CFF980-0x00CFF959的结果为28(十六进制),十六进制的28正好就是十进制的40,而我们创建的数组就是包含十个元素的 int 类型的数组,其大小就是40个字节。

二维数组

二维数组的数组名仍然可以表示首元素的地址,但是此时我们应该想到一个问题,这个“首元素的地址”,到底是第一个元素的地址(也就是下标为[0][0]的地址),还是第一行数组的地址呢?

#include<stdio.h>

int main()
{
	int arr[3][4] = { 0 };
	printf("%p\n", arr);
	printf("%p\n", arr + 1);

	return 0;
}

结果为:

十六进制的00AFFE20与00AFFE10的差值转换为十进制正好为16,也就是说二维数组的数组名表示的是首行元素的地址,我们也可以称之为首元素的地址,只不过要与一维数组作出区分。 

和一维数组相同的是,二维数组的数组名也有两种情况下表示的不是首元素的地址

1. sizeof(数组名),这个数组名表示整个二维数组,这个函数的结果是整个二维数组的大小;

#include<stdio.h>

int main()
{
	int arr[3][4] = { 0 };
	printf("%d\n", sizeof(arr));

	return 0;
}

3 * 4 * 4 = 48,单位是字节

2. &数组名表示整个二维数组

#include<stdio.h>

int main()
{
	int arr[3][4] = { 0 };
	printf("%p\n", &arr);
	printf("%p\n", &arr + 1);

	return 0;
}

两结果的差值转换为十进制为48。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值