详解数组计算题

今天看了一些有关数组的计算题,大致总结如下,希望各位看过以后,对数组能够有更好的理解:

一、数组名代表整个数组的两种情况:

  • sizeof(数组名)
  • &数组名

二、例题

//一维数组
int arr[] = {1, 2, 3, 4};

printf("%d\n", sizeof(arr));			// arr 表示整个数组,计算的是整个数组的字节大小---16
printf("%d\n", sizeof(arr + 0));		// arr+0 表示数组首元素的地址---4
printf("%d\n", sizeof(*arr));			// *arr 表示数组首元素---4
printf("%d\n", sizeof(arr + 1));		// arr+1 表示数组第二个元素的地址---4
printf("%d\n", sizeof(arr[1]));			// arr[1] 表示数组第二个元素---4
printf("%d\n", sizeof(&arr));			// &arr 表示整个数组的地址---4
printf("%d\n", sizeof(*&arr));			// *&arr 表示整个数组,计算的是整个数组的字节大小---16
printf("%d\n", sizeof(&arr + 1));		// &arr 表示整个数组的地址,&arr+1 表示跳过整个数组,整个数组后面那块空间的起始地址---4
printf("%d\n", sizeof(&arr[0]));		// &arr[0] 表示数组首元素的地址---4
printf("%d\n", sizeof(&arr[0] + 1));	// &arr[0] + 1 表示数组第二个元素的地址---4

//字符数组
char arr[] = {'a', 'b', 'c', 'd', 'e', 'f'};

printf("%d\n", sizeof(arr));				// arr 表示整个数组,计算的是整个数组的字节大小---6
printf("%d\n", sizeof(arr + 0));			// arr + 0 表示数组首元素的地址---4
printf("%d\n", sizeof(*arr));				// *arr 表示数组首元素---1
printf("%d\n", sizeof(arr[1]));				// arr[1] 表示数组第二个元素---1
printf("%d\n", sizeof(&arr));				// &arr 表示整个数组的地址---4
printf("%d\n", sizeof(&arr + 1));			// &arr 表示整个数组的地址,&arr+1 表示跳过整个数组,整个数组后面那块空间的起始地址---4
printf("%d\n", sizeof(&arr[0] + 1));		// &arr[0] + 1 表示数组第二个元素的地址---4

printf("%d\n", strlen(arr));				// 从'a'开始数,'f'的后面未知---随机值
printf("%d\n", strlen(arr + 0));			// 从'a'开始数,'f'的后面未知---随机值
printf("%d\n", strlen(*arr));				// *arr 表示首元素('a'--97),97这个地址不允许访问---error
printf("%d\n", strlen(arr[1]));				// arr[1] 表示数组第二个元素('b'--98),98这个地址不允许访问---error
printf("%d\n", strlen(&arr));				// 从'a'开始数,'f'的后面未知---随机值
printf("%d\n", strlen(&arr + 1));			// 跳过整个数组,从'f'后面开始数,'f'的后面未知---随机值,与上一个差6
printf("%d\n", strlen(&arr[0] + 1));		// 从'b'开始数,'f'的后面未知---随机值,与上上一个差1

char arr[] = "abcdef";

printf("%d\n", sizeof(arr));				// arr 表示整个数组,计算的是整个数组的字节大小,其中该数组包含'\0'---7
printf("%d\n", sizeof(arr + 0));			// arr+0 表示数组首元素的地址---4
printf("%d\n", sizeof(*arr));				// *arr 表示首元素---1
printf("%d\n", sizeof(arr[1]));				// arr[1] 表示数组第二个元素---1
printf("%d\n", sizeof(&arr));				// &arr 表示整个数组的地址---4
printf("%d\n", sizeof(&arr + 1));			// 跳过整个数组,整个数组后面(即'\0'后面)那块空间的起始地址---4
printf("%d\n", sizeof(&arr[0] + 1));		// &arr[0]+1 表示数组第二个元素的地址---4
printf("%d\n", strlen(arr));				// 从'a'开始数,'f'的后面遇见'\0'---6
printf("%d\n", strlen(arr + 0));			// 从'a'开始数,'f'的后面遇见'\0'---6
printf("%d\n", strlen(*arr));				// *arr 表示首元素('a'--97),97这个地址不允许访问---error
printf("%d\n", strlen(arr[1]));				// arr[1] 表示数组第二个元素('b'--98),98这个地址不允许访问---error
printf("%d\n", strlen(&arr));				// 从'a'开始数,'f'的后面遇见'\0'---6
printf("%d\n", strlen(&arr + 1));			// 跳过整个数组,从'\0'后开始数,'\0'的后面未知---随机值
printf("%d\n", strlen(&arr[0] + 1));		// 从'b'开始数,'f'的后面遇见'\0'---5

char* p = "abcdef";

printf("%d\n", sizeof(p));					// p 是一个指针变量,为一个地址---4
printf("%d\n", sizeof(p + 1));				// p+1 是'b'的地址---4
printf("%d\n", sizeof(*p));					// p 是一个字符指针,解引用后就是一个字符---1
printf("%d\n", sizeof(p[0]));				// p[0] <--> *(p+0) <--> *p---1
printf("%d\n", sizeof(&p));					// &p 是p的地址---4
printf("%d\n", sizeof(&p + 1));				// 跳过p,p后面那段空间的起始地址---4
printf("%d\n", sizeof(&p[0] + 1));			// &p[0]+1 是'b'的地址---4

printf("%d\n", strlen(p));					// 从'a'开始数,'f'的后面遇见'\0'---6
printf("%d\n", strlen(p + 1));				// 从'b'开始数,'f'的后面遇见'\0'---5
printf("%d\n", strlen(*p));					// size_t strlen(const char *string);---error
printf("%d\n", strlen(p[0]));				// size_t strlen(const char *string);---error
printf("%d\n", strlen(&p));					// 与字符串无关,p是一个变量,从p开始往后数,直到遇见'\0'---随机值
printf("%d\n", strlen(&p + 1));				// 与字符串无关,p是一个变量,从p后面开始往后数,直到遇见'\0'---随机值,与上面差4
printf("%d\n", strlen(&p[0] + 1));			// 从'b'开始数,'f'的后面遇见'\0'---5

//二维数组
int arr[3][4] = {0};

printf("%d\n", sizeof(arr));				// arr 表示整个数组,计算的是整个数组的字节大小---48
printf("%d\n", sizeof(arr[0][0]));			// arr[0][0] 表示整个数组的第一个元素(int)---4
printf("%d\n", sizeof(arr[0]));				// arr[0] 是二维数组首元素(有4个元素的一维数组)的数组名,表示整个一维数组---16
printf("%d\n", sizeof(arr[0] + 1));			// arr[0] 是有4个元素的一维数组首元素的地址,则arr[0]+1 是一维数组第二个元素的地址---4
printf("%d\n", sizeof(arr + 1));			// arr 是二维数组首元素(有4个元素的一维数组)的地址,则arr+1 是下一个一维数组的地址---4
printf("%d\n", sizeof(&arr[0] + 1));		// &arr[0] 是二维数组首元素(有4个元素的一维数组)的地址,则&arr[0]+1 是下一个一维数组的地址---4
printf("%d\n", sizeof(*arr));				// *arr 表示二维数组首元素(有4个元素的一维数组)的所有元素---16
printf("%d\n", sizeof(arr[3]));				// 不用访问,由类型(一维数组)可得---16
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值