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学习及比较的主要内容,如果未能解决你的问题,请参考以下文章