sizeof与strlen两兄弟的计算与区分

在我们每天的写代码过程中,我们都会用到这俩种库函数,我们想要知道计算sizeof和strlen的方法首先就要知道它们两表示什么意思,所以我们首先要有它们俩个的定义。

1.sizeof:计算字符串的大小,sizeof中的表达不参与运算;

2.strlen:计算字符串的长度,遇到‘\0’截止。

目录

1.一维数组下的sizeof与strlen

1.1一维数组(int型)下的sizeof

1.2一维数组(char型单个字符)下的sizeof

1.3一维数组(char型单个字符)下的strlen

1.4一维数组(char型字符串)下的sizeof

1.5一维数组(char型字符串)下的strlen

2.一级指针下的sizeof和strlen

2.1一级指针下的sizeof

2.2一级指针下的strlen

3.二维数组下的sizeof


1.一维数组下的sizeof与strlen

1.1一维数组(int型)下的sizeof

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
	int a[] = { 1,2,3,4 };
	printf("&d\n", sizeof(a));//16;sizeof(数组名),数组名表示整个数组,
	                         //计算的是整个数组的大小。
	printf("&d\n", sizeof(a+0));//4/8;a没有单独放在sizeof中,表示的是首元素
	           //地址,a+0也是首元素地址,地址就是4或者8字节.
	printf("&d\n", sizeof(*a));//4;a表示数组首元素地址,*a就是首元素大小。
	printf("&d\n", sizeof(a+1));//4/8;a+1表示第二个元素地址。
	printf("&d\n", sizeof(a[1]));//4;a[1]表示第二个元素,为4字节。
	printf("&d\n", sizeof(&a));//4/8;&数组名,数组名表示整个数组,取出的是
	           //整个数组的地址。
	printf("&d\n", sizeof(*&a));//16;把数组整个取出解引用,4*4=16个字节。
	printf("&d\n", sizeof(&a+1));//4/8;表示这个一维数组之后的一个地址,是
	          //地址就是4或8个字节。
	printf("&d\n", sizeof(&a[0]));//4/8;表示首元素地址大小。
	printf("&d\n", sizeof(&a[0]+1));//4/8;表示第二个元素的大小。
	return 0;

}

1.sizeof(数组名),这个数组名表示整个数组,计算的是整个数组的大小;

2.sizeof(&数组名),数组名表示整个数组,取出的是整个数组的地址;

3.除此之外,sizeof后数组名的变形都是首元素的地址。

1.2一维数组(char型单个字符)下的sizeof

int main()//一维字符型
{
	char arr[] = { 'a','b','c','d','e','f' };
	printf("%d\n", sizeof(arr));//6;arr单独放在sizeof内部,计算整个数组大小。
	printf("%d\n", sizeof(*arr));//1;*arr是对数组首元素地址的解引用,
	        //计算的是数组首元素的大小。
	printf("%d\n", sizeof(arr+0));//4/8;arr+0是数组首元素的地址。
	printf("%d\n", sizeof(arr[1]));//1;arr[1]是数组第二个元素的大小。
	printf("%d\n", sizeof(&arr));//4/8;&arr取出的是整个数组的地址。
	printf("%d\n", sizeof(&arr+1));//4/8;&arr+1指的是arr之后的一块地址,是地址
	        //就是4或者8个字节。
	printf("%d\n", sizeof(&arr[0]+1));//4/8;指的是数组第二个元素的地址。
	return 0;
}

1.3一维数组(char型单个字符)下的strlen

int main()//一维字符型
{
	char arr[] = { 'a','b','c','d','e','f' };
	printf("%d\n", strlen(arr));//随机值;strlen遇到‘\0’停止。
	printf("%d\n", strlen(*arr));//非法访问;*arr是首元素,即‘a’,对应
	//ASCII值是97,即strlen(97),不能直接访问。
	printf("%d\n", strlen(arr + 0));//随机值;
	printf("%d\n", strlen(arr[1]));//非法访问;同*arr。
	printf("%d\n", strlen(&arr));//随机值;
	printf("%d\n", strlen(&arr + 1));//随机值;
	printf("%d\n", strlen(&arr[0] + 1));//随机值;是第二个元素单独地址,求
	        //数组的字符串长度也是随机值。
	return 0;
}

1.strlen求的是字符串长度,遇‘\0’停止;

2.strlen中放入对应ASCII值,不能直接访问,是非法的;

3.&arr虽然是数组的地址,但是也是从数组起始位置开始的,计算得到的结果还是随机值。

1.4一维数组(char型字符串)下的sizeof

int main()
{
	char arr[] = "abcdef";
	//共有7个元素,'a' 'b' 'c' 'd' 'e' 'f' '\0'
	printf("%d\n", sizeof(arr));//7;计算的是整个数组的大小。
	printf("%d\n", sizeof(arr+0));//4/8;arr+0表示数组首元素地址。
	printf("%d\n", sizeof(*arr));//1;对数组首元素地址解引用,计算的是数组第一个
	   //元素的大小。
	printf("%d\n", sizeof(arr[1]));//1;计算的是数组第二个元素的大小。
	printf("%d\n", sizeof(&arr));//4/8;&arr取出的是整个数组的地址。
	printf("%d\n", sizeof(&arr+1));//4/8;指的是这个数组之后一块空间的地址。
	printf("%d\n", sizeof(&arr[0]+1));//4/8;指的是数组第二个元素的地址。
	return 0;
}

1.5一维数组(char型字符串)下的strlen

int main()
{
	char arr[] = "abcdef";
	//共有7个元素,'a' 'b' 'c' 'd' 'e' 'f' '\0'
	printf("%d\n", strlen(arr));//6;arr是数组首元素的地址,strlen从首元素
	       //地址开始统计,遇'\0'截止。
	printf("%d\n", strlen(arr + 0));//6,;arr+0是数组首元素地址,同arr。
	printf("%d\n", strlen(*arr));//非法访问;对数组首元素地址解引用,即
	//strlen(a)-->strlen(97)不能直接访问。
	printf("%d\n", strlen(arr[1]));//非法访问;即strlen(b),不能直接访问。
	printf("%d\n", strlen(&arr));//6;&arr取出的是整个数组的地址,strlen从首元素
	       //地址开始统计,遇'\0'截止。
	printf("%d\n", strlen(&arr + 1));//随机值;指的是这个数组之后一块空间
	//的地址,计算的结果是随机值。
	printf("%d\n", strlen(&arr[0] + 1));//5;指的是数组第二个元素的地址,
	//从第二个元素开始统计,遇'\0'截止。
	return 0;
}

2.一级指针下的sizeof和strlen

2.1一级指针下的sizeof

int main()//指针型
{
	char* p = "abcdef";
	printf("%d\n", sizeof(p));//4/8;p是指针变量,大小就是4/8.
	printf("%d\n", sizeof(p+1));//4/8;p+1是b的地址。
	printf("%d\n", sizeof(*p));//1;对首元素地址进行解引用,大小为1个字节。
	printf("%d\n", sizeof(p[0]));//1;p[0]-->*p,就是1个字节。
	printf("%d\n", sizeof(&p));//4/8;二级指针,指针就是4/8个字节。
	printf("%d\n", sizeof(&p+1));//4/8;指跳过p变量之后的地址。
	printf("%d\n", sizeof(&p[0]+1));//4/8;指第二个元素的地址。
	return 0;
}

1.地址就是4或者8个字节,具体取决于编译器是x86还是x64。

2.不管是一级指针还是二级指针大小都是4或者8

2.2一级指针下的strlen

int main()//指针型
{
	char* p = "abcdef";
	printf("%d\n", strlen(p));//6;求字符串长度。
	printf("%d\n", strlen(p + 1));//5;从b的地址开始计算。
	printf("%d\n", strlen(*p));//非法访问;原因同前例;
	printf("%d\n", strlen(p[0]));//非法访问;
	printf("%d\n", strlen(&p));//随机值;&p拿到的是p这个指针变量的起始地址,
	//从这里开始求字符串长度是一个随机值。
	printf("%d\n", strlen(&p + 1));//随机值;跳过p变量的地址,所求长度也是随机值。
	printf("%d\n", strlen(&p[0] + 1));//5;从第二个元素地址开始统计。
	return 0;
}

3.二维数组下的sizeof

int main()//二维数组
{
	int a[3][4] = { 0 };
	printf("%d\n", sizeof(a));//48;sizeof(数组名)表示整个数组,
	//计算的是整个数组的大小。
	printf("%d\n", sizeof(a[0][0]));//4;计算数组首元素的大小。
	printf("%d\n", sizeof(a[0]));//16;a[0]是数组第一行的数组名,数组名单独
	//放在sizeof内部,计算的就是数组(第一行)的大小。
	printf("%d\n", sizeof(a[0]+1));//4/8;a[0]作为第一行的数组名,没有单独
	//放在sizeof内部,没有&,表示的就是数组首元素的地址,即a[0]-->a[0][0],
	//则a[0]+1表示的就是数组第一行第二个元素的地址。
	printf("%d\n", sizeof(*(a[0]+1)));//4;结合a[0]+1,我们对它进行解引用,
	//得到的是第一行第二个元素的大小,也就是4字节。
	printf("%d\n", sizeof(a+1));//4/8;数组名没有单独放在sizeof内部,数组名
	//表示首元素地址,就是第一行的地址,a+1就是第二行的地址。
	printf("%d\n", sizeof(*(a+1)));//16;*(a+1)-->a[1]计算第二行元素大小。
	printf("%d\n", sizeof(&a[0]+1));//4/8;&a[0]是第一行地址,&a[0]+1就是第二行元素地址。
	printf("%d\n", sizeof(*(&a[0]+1)));//16;*(&a[0]+1)-->a[1]-->*(a+1),
	//计算第二行元素的大小。
	printf("%d\n", sizeof(*a));//16;a表示数组第一行元素地址,*a-->a[0],计算的
	//是数组第一行元素的大小。
	printf("%d\n", sizeof(a[3]));//16;如果存在第四行,a[3]计算的就是数组
	//第四行元素的大小。
	return 0;
}

1.在二维数组中,sizeof(数组名)仍然表示整个数组的大小;

2.在二维数组中,a[0]单独放在sizeof内部表示的就是数组第一行的所有元素

3.在二维数组中,&a[0]表示数组第一行元素的地址

4.在二维数组中,sizeof(a+1),表示的是数组第二行元素的地址;

5.放在sizeof内部的表达式是不会参与运算的,所以a[3]也不存在越界访问的问题,只是查看,但并没有执行。


好了,今天的分享结束啦,还请大家好好学习,天天向上!!!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

月亮夹馍干

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值