关于数组的 sizeof和strlen 的一些计算

sizeof 计算的是数据在内存中存放的长度,单位是“字节”,可以对任何数据类型做运算,而且它是一个运算符(和+、-、*、\类似);当对字符串计算时,包含末尾的"\0";当对字符数组操作时,返回的是数组的总的长度。                                                                                          strlen 计算的是字符串的长度,单位是“字符”,只能对字符串运算,而且它是函数,计算时,不包含末尾的"\0";当对字符数组操作时,返回的是数组总存放的字符串的实际长度(也就是\0之前的),也就是当把数组作为参数传递给strlen时是会退化成char*指针的。                                                      例如:char *p = "haha";
     printf("%d\n", sizeof("hehe"));//5
     printf("%d\n", strlen("hehe"));//4
     printf("%d\n", sizeof(*p));//1
     printf("%d\n", sizeof(p));//4

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
int main()
{//一维数组
	int a[] = { 1, 2, 3, 4 };
	//一个整型数组,4个元素
	printf("第一题:%d\n", sizeof(a));//16
	//数组名单独放在sizeof内,此时数字组名表示整个数组,及整个数组的长度为4*4,单位为字节
	printf("第二题:%d\n", sizeof(a + 0));//4
	//此处数组名没有单独放在sizeof内,数组名降级仅表示首元素地址,首元素地址+0仍为首元素地址
	//需注意地址存放在内存中  均为   4个字节
	printf("第三题:%d\n", sizeof(*a));//4
	//数组名表示首元素地址,加解引用操作后,表示首元素1,整型占4个字节
	printf("第四题:%d\n", sizeof(a + 1));//4
	//首元素地址+1为第二个元素地址,若是地址即占4个字节
	printf("第五题:%d\n", sizeof(a[1]));//4
	//a[1]即第二个元素2,整型占4个字节
	printf("第六题:%d\n", sizeof(&a));//4
	//&后面跟数组名,此时数字组名表示整个数组,即整个数组的地址,若是地址即占4个字节
	printf("第七题:%d\n", sizeof(&a + 1));//4
	//同上&a为整个数组地址,地址+1仍为地址,地址即占4个字节
	//需注意:此处数组地址+1,表示跳过数组,元素4后面的地址,应与第四题区分开
	printf("第八题:%d\n", sizeof(&a[0]));//4
	//&a[0]即首元素地址,若是地址即占4个字节
	printf("第九题:%d\n", sizeof(&a[0] + 1));//4
	//&a[0]+1即第二个元素地址,若是地址即占4个字节

//字符数组
	char arr1[] = {'a','b','c','d','e','f'};
	//定义一个有6个元素的字符数组
	printf("第一题: %d\n",sizeof(arr1));//6
	//数组名单独放在sizeof内,此时数字组名表示整个数组,及整个数组的长度为6 * 1,单位为字节
	printf("第二题: %d\n", sizeof(arr1+0));//4
	//此处数组名没有单独放在sizeof内,数组名降级仅表示首元素地址,首元素地址+0仍为首元素地址
	//需注意地址存放在内存中  均为  4个字节
	printf("第三题: %d\n", sizeof(*arr1));//1
	//数组名表示首元素地址,加解引用操作后,表示首元素'a',字符型占1个字节
	printf("第四题: %d\n", sizeof(arr1[1]));//1
	//a[1]即第二个元素2,整型占4个字节
	printf("第五题: %d\n", sizeof(&arr1));//4
	//&后面跟数组名,此时数字组名表示整个数组,即整个数组的地址,若是地址即占4个字节
	printf("第六题: %d\n", sizeof(&arr1+1));//4
	//同上&arr为整个数组地址,地址+1仍为地址,地址即占4个字节
	//需注意:此处数组地址+1,表示跳过数组,元素'f'后面的地址
	printf("第七题: %d\n", sizeof(&arr1[0]+1));//4
	//&a[0]+1即第二个元素地址,若是地址即占4个字节


	//arr1[] = {'a','b','c','d','e','f'};
	//注:strlen参数应为 字符串地址且遇到'\0'才结束
	printf("第八题: %d\n",strlen(arr1));//随机数
	//arr1表示首元素地址,一直没有找到'\0',给了一个随机数
	printf("第九题: %d\n", strlen(arr1+0));//随机数
	//arr1+0表示首元素地址,一直没有找到'\0',给了一个随机数
	//printf("第十题: %d\n", strlen(*arr1));//报错(测试前面值时应注释掉)
	*arr1表示首元素'a',不是地址
	//printf("第十一题: %d\n", strlen(arr1[1]));//报错
	//arr1[1]表示第二个元素'b',不是地址
	printf("第十二题: %d\n", strlen(&arr1));//随机数(会有警告,参数类型不同)
	//整个数组的元素的地址,一直没有找到'\0',给了一个随机数
	printf("第十三题: %d\n", strlen(&arr1+1));//随机数
	//来到'f'后面的地址,一直没有找到'\0',给了一个随机数
	printf("第十四题: %d\n", strlen(&arr1[0]+1));//随机数
	//&arr1[0]+1表示第二个元素'b'地址,一直没有找到'\0',给了一个随机数


//字符串
	char *p = "abcdef";
	//一串字符串默认后面有一个'\0'
	//定义一个指针p,指向有6+1个元素的字符串首地址
	printf("第一题: %d\n", sizeof(p));//4
	//p为指针,指针的长度为4个字节
	printf("第二题: %d\n", sizeof(p + 0));//4
	//p表示首元素地址,首元素地址+0仍为首元素地址
	printf("第三题: %d\n", sizeof(*p));//1
	//p表示首元素地址,加解引用操作后,表示首元素'a',字符型占1个字节
	printf("第四题: %d\n", sizeof(p[1]));//1
	//p[1]即第二个元素'b',字符型占1个字节
	printf("第五题: %d\n", sizeof(&p));//4
	//&p,即指针p的地址,若是地址即占4个字节
	printf("第六题: %d\n", sizeof(&p + 1));//4
	//同上&p指针p的地址,地址+1仍为地址,地址即占4个字节
	//需注意:此指针p的地址+1,来到指针p地址后面的地址
	printf("第七题: %d\n", sizeof(&p[0] + 1));//4
	//&p[0]+1即第二个元素地址,若是地址即占4个字节


	//char *p = "abcdef";
	//一串字符串默认后面有一个'\0'
	//定义一个指针p,指向有6+1个元素的字符串首地址

	printf("第八题: %d\n", strlen(p));//6
	//前面说字符串有7个元素
	//但是strlen求长度时并不把'\0'计算在内
	//p表示首元素地址,找到'\0',长度为6
	printf("第九题: %d\n", strlen(p + 1));//5
	//p+1表示第二个元素地址,即从第二个开始找,找到'\0',长度为5
	//printf("第十题: %d\n", strlen(*p));//报错(测试前面值时应注释掉)
	*p表示首元素'a',不是地址
	//printf("第十一题: %d\n", strlen(p[1]));//报错
	//p[1]表示第二个元素'b',不是地址
	printf("第十二题: %d\n", strlen(&p));//随机数
	//&p,即指针p的地址,一直没有找到'\0',给了一个随机数
	printf("第十三题: %d\n", strlen(&p + 1));//随机数
	//来到指针p的地址后面的地址,一直没有找到'\0',给了一个随机数
	printf("第十四题: %d\n", strlen(&p[0] + 1));//5
	//&p[0]+1表示第二个元素'b'的地址,即从第二个开始找,找到'\0',长度为5


//二维数组
	int arr2[3][4] = {0};
	//定义一个3行4列的二维数组
	printf("第一题:%d\n", sizeof(arr2));//48
	//数组名单独放在sizeof内,此时数字组名表示整个数组,及整个数组的长度为(3*4)*4,单位为字节
	printf("第二题:%d\n", sizeof(arr2[0][0]));//4
	//arr2[0][0]表示首元素,整型4个字节
	printf("第三题:%d\n", sizeof(arr2[0]));//16
	//arr2[0]表示二维数组的首元素,即第一行元素长度,4*4
	printf("第四题:%d\n", sizeof(arr2[0] + 1));//4
	//二维数组首元素+1为第二个元素,arr2[0] + 1,相当于给一个数组元素+1,转化为整形,长度为4
	printf("第五题:%d\n", sizeof(arr2+1));//4
	// 此处数组名没有单独放在sizeof内,数组名降级仅表示首元素地址,首元素地址 + 1仍为地址
	//此处arr2+1表示二维数组的第二个元素的地址,即第二行的地址
	printf("第六题:%d\n", sizeof(&arr2[0]+1));//4
	//&arr2[0]即首元素地址,&arr2[0]+1仍为数组,即占4个字节
	printf("第七题:%d\n", sizeof(*arr2));//16
	// 此处数组名没有单独放在sizeof内,数组名降级仅表示首元素地址,解引用后表示第一行,同第二题
	//同上&a为整个数组地址,地址+1仍为地址,地址即占4个字节
	//需注意:此处数组地址+1,表示跳过数组,元素4后面的地址,应与第四题区分开
	printf("第八题:%d\n", sizeof(arr2[3]));//16
	//***此处需注意,数组没有第四行,感觉好像数组越界,程序报错,并不是
	//sizeof操作符是在编译时计算的,程序还没有运行,并没有给数组分配内存
	//此处arr2[3]同第三题的arr2[0]
	//程序运行时并不执行sizeof里面的语句
	

	fflush(stdin);
	getchar();
	return 0;
}
注意:数组名代表整个数组的时候只有两种情况
sizeof(数组名),这里的数组名表示整个数组
&数组名,这里的数组名代表整个数组

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值