sizeof和strlen学习及比较

Posted 軒邈

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sizeof和strlen学习及比较相关的知识,希望对你有一定的参考价值。

/*
	2022.05.18
	目的:
		深入学习 sizeof 与 strlen,并且有效区分两者。
	
	理论:
		1.sizeof 
			a.是单目操作符,用于计算变量的字节大小;
			b.以字节的形式,给除了其操作数的大小;
			c.变量有;整数和浮点类型,指针类型和复合数据类型,结构体等等

		2.strlen
			a.C 库函数 size_t strlen(const char *str) 计算字符串 str 的长度,直到空结束字符,但不包括空结束字符;
			b.#include<string.h> 需要调用字符函数库;
	功能:
*/

#include<stdio.h>
#include<string.h>

int main(void)

	/* sizeof */
	char cCh;            /* 字符型数据   */
	signed char scCh;    /* 有符号字符型 */
	unsigned char ucCh;  /* 无符号字符型 */
	printf("cCh = %d, scCh = %d, ucCh = %d\\n\\n", sizeof(cCh), sizeof(scCh), sizeof(ucCh));

	short int siInt;           /* 短整型       */
	signed short int ssiInt;   /* 有符号短整型 */
	unsigned short int usiInt; /* 无符号短整型 */
	printf("siInt = %d, ssiInt = %d, usiInt = %d\\n\\n", sizeof(siInt), sizeof(ssiInt), sizeof(usiInt));

	int iInt;           /* 整型       */
	signed int sInt;    /* 有符号整型 */
	unsigned int usInt; /* 无符号整型 */
	printf("iInt = %d, siInt = %d, usInt = %d\\n\\n", sizeof(iInt), sizeof(sInt), sizeof(usInt));

	long int  lInt;           /* 长整型 */
	signed long int slInt;    /* 有符号长整型 */
	unsigned long int uslInt; /* 无符号长整型 */
	printf("lInt = %d, slInt = %d, uslInt = %d\\n\\n", sizeof(lInt), sizeof(slInt), sizeof(uslInt));

	float fNum;          /* 单精度浮点型 */
	double dNum;         /* 双精度浮点型 */
	long double ldNum;   /* 长双精度浮点型 */
	printf("fNum = %d, dNum = %d, ldNum = %d\\n\\n", sizeof(fNum), sizeof(dNum), sizeof(ldNum));

	int iArry[10] = 1,2,3,4,5,6,7,8,9;
	printf("整体iArry = %d, 每个元素iArry = %d, 数组有%d个元素\\n", sizeof(iArry), sizeof(iArry[0]), sizeof(iArry)/sizeof(iArry[0]) );
	printf("sizeof(iArry + 0)     = %d\\n", sizeof(iArry + 0)); /* 数组首元素的地址 */
	printf("sizeof(*iArry)        = %d\\n",    sizeof(*iArry)); /* 第一个元素的大小 */
	printf("sizeof(iArry + 1)     = %d\\n", sizeof(iArry + 1)); /* 第二个元素的地址 */
	printf("sizeof(&iArry)        = %d\\n",    sizeof(&iArry)); /* 存放首地址的地址 */
	printf("sizeof(*&iArry)       = %d\\n",   sizeof(*&iArry)); /* 反解首地址的地址 */
	printf("sizeof(&iArry + 1)    = %d\\n",sizeof(&iArry + 1)); /* 跳过一个首地址的地址 */
	printf("sizeof(&iArry[0])     = %d\\n", sizeof(&iArry[0])); /* 第一个元素的地址 */
	printf("sizeof(&iArry[0] + 1) = %d\\n\\n", sizeof(&iArry[0] + 1)); /* 第二个个元素的地址 */

	char cArry[10] = 1,2,3,4,5,6,7,8,9;
	printf("整体cArry = %d, 每个元素cArry = %d, 数组有%d个元素\\n", sizeof(cArry), sizeof(cArry[0]), sizeof(cArry)/sizeof(cArry[0]) );
	printf("sizeof(cArry + 0)     = %d\\n", sizeof(cArry + 0)); 
	printf("sizeof(*cArry)        = %d\\n",    sizeof(*cArry));
	printf("sizeof(cArry + 1)     = %d\\n", sizeof(cArry + 1));
	printf("sizeof(&cArry)        = %d\\n",    sizeof(&cArry));
	printf("sizeof(*&cArry)       = %d\\n",   sizeof(*&cArry));
	printf("sizeof(&cArry + 1)    = %d\\n",sizeof(&cArry + 1));
	printf("sizeof(&cArry[0])     = %d\\n", sizeof(&cArry[0]));
	printf("sizeof(&cArry[0] + 1) = %d\\n\\n", sizeof(&cArry[0] + 1));

	char* p = "abcdefg";
	printf("sizeof(p)         = %d\\n", sizeof(p));         /* 指针大小 */
	printf("sizeof(p + 0)     = %d\\n", sizeof(p + 0));     /* 首地址大小 */
	printf("sizeof(*p)        = %d\\n", sizeof(*p));        /* 反解首地址则为之值的大小 */
	printf("sizeof(p[1])      = %d\\n", sizeof(p[1]));      /* 第二个元素的大小 */
	printf("sizeof(&p)        = %d\\n", sizeof(&p));        /* 首地址的地址的大小 */
	printf("sizeof(&p + 1)    = %d\\n", sizeof(&p + 1));    /* 和首地址的地址相似的下一个地址的大小 */
	printf("sizeof(&p[0] + 1) = %d\\n\\n", sizeof(&p[0] + 1)); /* 第二个元素的地址 */
									
	/* strlen */
	char cArryStrlen[] = 'a','b','c','d','e','f','g','h';
	printf("strlen(cArryStrlen)         = %d\\n", strlen(cArryStrlen)); /* 随机值,因为没有以\\0结尾 */
	printf("strlen(cArryStrlen + 0)     = %d\\n", strlen(cArryStrlen + 0)); /* 同上 */
	//printf("%d\\n", strlen(*cArryStrlen));   /* 因为 *cArryStrlen表示的是某一个字符,但是strle函数接收的是一个指针,所以程序报错  */
	//printf("%d\\n", strlen(cArryStrlen[1])); /* 错误原因同上 */
	//printf("%d\\n", strlen(&cArryStrlen));
	//printf("%d\\n", strlen(&cArryStrlen + 1)); /* C++环境不兼容 */
    printf("strlen(&cArryStrlen[0] + 1) = %d\\n\\n", strlen(&cArryStrlen[0] + 1)); /* 随机值,因为数组没有以\\0结尾 */
	//以上表达式输出的均是随机值

	char cArryStrlen2[] = "abcdefgh";
	printf("strlen(cArryStrlen2)         = %d\\n", strlen(cArryStrlen2));           /* 计算该字符串的长度,注意不包括\\0 */
	printf("strlen(cArryStrlen2 + 0)     = %d\\n", strlen(cArryStrlen2 + 0));       /* 计算从第一个字符后字符串的长度 */
	printf("strlen(&cArryStrlen2[0] + 1) = %d\\n\\n", strlen(&cArryStrlen2[0] + 1)); /* 跳过第一个字符计算长度 */

	char* q = "abcdef";
	printf("strlen(q)         = %d\\n", strlen(q));    /* 计算该字符串的长度,注意不包括\\0  */
	printf("strlen(q + 0)     = %d\\n", strlen(q + 0));/* 计算从第一个字符后字符串的长度 */
	//printf("%d\\n", strlen(*p))                      
	//printf("%d\\n", strlen(p[1]));
	//printf("%d\\n", strlen(&p));
	//printf("%d\\n", strlen(&p)); /* C++环境不兼容 */
	printf("strlen(&q[0] + 1) = %d\\n\\n", strlen(&q[0] + 1)); /* 跳过第一个字符计算长度 */

	return 0;


/*
	程序运行结果:

		cCh = 1, scCh = 1, ucCh = 1

		siInt = 2, ssiInt = 2, usiInt = 2

		iInt = 4, siInt = 4, usInt = 4

		lInt = 4, slInt = 4, uslInt = 4

		fNum = 4, dNum = 8, ldNum = 8

		整体iArry = 40, 每个元素iArry = 4, 数组有10个元素
		sizeof(iArry + 0)     = 4
		sizeof(*iArry)        = 4
		sizeof(iArry + 1)     = 4
		sizeof(&iArry)        = 4
		sizeof(*&iArry)       = 40
		sizeof(&iArry + 1)    = 4
		sizeof(&iArry[0])     = 4
		sizeof(&iArry[0] + 1) = 4

		整体cArry = 10, 每个元素cArry = 1, 数组有10个元素
		sizeof(cArry + 0)     = 4
		sizeof(*cArry)        = 1
		sizeof(cArry + 1)     = 4
		sizeof(&cArry)        = 4
		sizeof(*&cArry)       = 10
		sizeof(&cArry + 1)    = 4
		sizeof(&cArry[0])     = 4
		sizeof(&cArry[0] + 1) = 4

		sizeof(p)         = 4
		sizeof(p + 0)     = 4
		sizeof(*p)        = 1
		sizeof(p[1])      = 1
		sizeof(&p)        = 4
		sizeof(&p + 1)    = 4
		sizeof(&p[0] + 1) = 4

		strlen(cArryStrlen)         = 19
		strlen(cArryStrlen + 0)     = 19
		strlen(&cArryStrlen[0] + 1) = 18

		strlen(cArryStrlen2)         = 8
		strlen(cArryStrlen2 + 0)     = 8
		strlen(&cArryStrlen2[0] + 1) = 7

		strlen(q)         = 6
		strlen(q + 0)     = 6
		strlen(&q[0] + 1) = 5
*/

创作打卡挑战赛 赢取流量/现金/CSDN周边激励大奖

以上是关于sizeof和strlen学习及比较的主要内容,如果未能解决你的问题,请参考以下文章

sizeof 和 strlen 的区别

14strlen和sizeof区别?

对sizeof的思考

strlen和sizeof有啥区别?

sizeof strlen详细差别比较

比较strlen和sizeof区别