c语言中的数组sizeof和strlen

sizeof   strlen
sizeof():  返回一个对象或者类型所占的内存字节数。
strlen():  用来计算字符串的长度,遇到"\0"结束。

我们分别从一维数组,字符数组,二维数组的例子来分析。

注:数组名代表整个数组的时候只有两种情况
  sizeof(数组名):数组名单独在sizeof中时表示整个数组。
  &数组名:这里的数组名表示整个数组。

1.一维数组。

#include <stdio.h>
int main()
{
	int a[]={0,1,2,3};
	printf("%d\n",sizeof(a));// 16 整个数组的大小
	printf("%d\n",sizeof(a+0));// 4 首元素地址
	printf("%d\n",sizeof(*a)); // 4  首元素
	printf("%d\n",sizeof(a+1));// 4  第二个元素的地址
	printf("%d\n",sizeof(a[1]));//4   第二个元素
	printf("%d\n",sizeof(&a)); // 4   数组的地址
	printf("%d\n",sizeof(*&a));// 16  数组的地址解引用,表示整个数组
	printf("%d\n",sizeof(&a+1));// 4   跳过整个数组,指向数组后面的一个地址
	printf("%d\n",sizeof(&a[0]));//4   首元素地址
	printf("%d\n",sizeof(&a[0]+1));//4 第二个元素的地址
	return 0;
}

2.字符数组。
#include <stdio.h>
int main()
{
	char* p="abcdef";
	printf("%d\n",sizeof(p));//4 元素a的地址
	printf("%d\n",sizeof(p+1));//4 元素b的地址
	printf("%d\n",sizeof(*p));//1 解引用为指向一个字符的大小
	printf("%d\n",sizeof(p[0]));//1 首元素
	printf("%d\n",sizeof(&p));//4  p的地址
	printf("%d\n",sizeof(&p+1));//4 p之后的地址
	printf("%d\n",sizeof(&p[0]+1));//4 指向b的地址
	printf("%d\n",strlen(p));//6 从a开始字符串的长度
	printf("%d\n",strlen(p+1));//5 从b开始字符串的长度
	//printf("%d\n",strlen(*p));// error
	//printf("%d\n",strlen(p[0]));//error
	printf("%d\n",strlen(&p));   //随机值
	printf("%d\n",strlen(&p+1)); //随机值
	printf("%d\n",strlen(&p[0]+1));	//5 从b开始找
	return 0;
}

#include <stdio.h>
int main()
{
	char  arr[]={'a','b','c','d','e','f'};
	printf("%d\n",sizeof(arr));//6 整个数组大小
	printf("%d\n",sizeof(arr+0));//4 首元素的地址
	printf("%d\n",sizeof(*arr));//1 首元素大小
	printf("%d\n",sizeof(arr[1]));//1 第二个元素
	printf("%d\n",sizeof(&arr));//4  数组的地址
	printf("%d\n",sizeof(&arr+1));//4 整个数组之后的地址
	printf("%d\n",sizeof(&arr[0]+1));//4 第二个元素的地址
	printf("%d\n",strlen(arr));//随机值
	printf("%d\n",strlen(arr+0));//随机值
	//printf("%d\n",strlen(*arr));// error
	//printf("%d\n",strlen(arr[1]));//error
	printf("%d\n",strlen(&arr));   //随机值
	printf("%d\n",strlen(&arr+1)); //随机值
	printf("%d\n",strlen(&arr[0]+1));	//随机值
	return 0;
}

#include <stdio.h>
int main()
{
	char  arr[]="abcdef";
	printf("%d\n",sizeof(arr));//7 整个数组大小
	printf("%d\n",sizeof(arr+0));//4 首元素的地址
	printf("%d\n",sizeof(*arr));//1 首元素大小
	printf("%d\n",sizeof(arr[1]));//1 第二个元素
	printf("%d\n",sizeof(&arr));//4  数组的地址
	printf("%d\n",sizeof(&arr+1));//4 整个数组之后的地址
	printf("%d\n",sizeof(&arr[0]+1));//4 第二个元素的地址
	printf("%d\n",strlen(arr));//6 从a开始找
	printf("%d\n",strlen(arr+0));//	6
	//printf("%d\n",strlen(*arr));// error
	//printf("%d\n",strlen(arr[1]));//error
	printf("%d\n",strlen(&arr)); // 6 从a开始找  
	printf("%d\n",strlen(&arr+1)); //随机值
	printf("%d\n",strlen(&arr[0]+1));//5从b开始找
	return 0;
}

3.二维数组。
#include <stdio.h>
int main()
{
	int a[3][4]={0};
	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+1));//4  第二行地址
	printf("%d\n",sizeof(&a[0]+1));//4 第二行地址
	printf("%d\n",sizeof(*a));//16  第一行
	printf("%d\n",sizeof(*&a));//48 整个数组
	printf("%d\n",sizeof(a[3]));//16  第四行
	return 0;
}


  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值