admin管理员组文章数量:1573690
C语言——sizeof和strlen用法
- 一、sizeof简介及用法
- 1.sizeof 的简介
- 2.sizeof 的用法
- (a).以整形、字符型、浮点型、结构体类型作为参数
- (b).以一维数组、二维数组、字符数组作为参数
- (c).sizeof在编译时就计算出类型实际所占的字节数大小
- (d)sizeof不能计算动态分配空间的大小
- 二、strlen的简介及用法
- 1.strlen()函数与操作符sizeof的区别
- 2.模拟实现strlen()函数
- 3.strlen()函数计算字符数组题型解析
- 4.strlen()函数计算字符串题型解析
一、sizeof简介及用法
1.sizeof 的简介
(1)sizeof是运算符,它的类型可以是类型,类型又包括整形、字符型、浮点型,结构体类型等,计算的是分配空间的实际字节数。
(2)sizeof在编译时就计算出类型实际所占的字节数大小
(3)sizeof不能计算动态分配空间的大小
2.sizeof 的用法
(a).以整形、字符型、浮点型、结构体类型作为参数
struct Stu
{
char name[20];
int num;
};
int main()
{
int a = 10; //定义整形数据类型a
printf(" %zu\n", sizeof(a)); // 4 --> 计算整形a所占字节数大小
char ch = "A";
printf(" %zu\n", sizeof(ch)); // 1 --> 计算字符型ch所占字节数大小
double b = 10.0;
printf(" %zu\n", sizeof(b)); // 8 --> 计算浮点型b所占字节数大小
struct Stu stu;
printf(" %zu\n", sizeof(stu)); // 24 --> 计算结构体类型stu所占字节数大小(内存补齐)
return 0;
}
(b).以一维数组、二维数组、字符数组作为参数
当数组作为参数的时候,这里我们先来了解数组名的意义
(1)sizeof(数组名),这里的数组名表示整个数组,计算的是整个数组的大小。
(2)&数组名,这里的数组名表示整个数组,取出的是整个数组的地址。
(3)除此之外所有的数组名都表示首元素的地址
int main()
{
//一维数组
int arr[5] = { 1,2,3,4,5 };
//20,arr作为数组名单独放在sizeof内部,计算的是数组总大小,单位是字节
printf(" %zu\n", sizeof(arr));
//4,arr并非单独放在sizeof内部,也没有&,所以这里计算的就是首元素地址,单位是字节
printf(" %zu\n", sizeof(arr + 0));
//二维数组
int arr1[3][4] = { 0 };
//48,arr1单独放在sizeof内部,计算的是数组总大小,3*4*4=48,单位是字节
printf(" %zu\n", sizeof(arr1));
//4,arr1并非单独放在sizeof内部,也没有&,所以计算的是第二个元素的大小
//此时二维数组要想象为一维数组 (arr1 + 1) < -- > arr1[1][j](j=0,1,2,3)的 "地址"
//还要注意的是既然是 "地址" 就一律按4个字节处理(32位机器的条件下)
printf(" %zu\n", sizeof(arr1 + 1));
//字符数组
char str[] = { 'a','b','c','d','e','f' };
//6,str单独放在sizeof内部,计算的是数组总大小,单位是字节
printf(" %zu\n", sizeof(str));
//4,str没有单独放在sizeof内部,也没有&,str表示的是首元素 "地址",
//(str + 1)计算第二个元素的 "地址" ,是 "地址" 就是4个字节(32位机器下)
printf(" %zu\n", sizeof(str + 1));
return 0;
}
©.sizeof在编译时就计算出类型实际所占的字节数大小
int main()
{
int num = 10;
printf("%zu\n", sizeof(num = 10 + 20));
//sizeof()在编译时就计算出结果,所以num=10,并不会计算sizeof里面的表达式
printf("%d\n", num);
return 0;
}
(d)sizeof不能计算动态分配空间的大小
int main()
{
int* p = (int*)malloc(sizeof(int) * 20);
for (int i = 0; i < 20; i++)
{
*(p + i) = i;
}
//4,p作为数组名单独放在sizeof内部,计算的是整个数组,
//而sizeof并不会计算动态分配的内存,所以结果为4(32位条件下)
printf("%zu\n", sizeof(p));
free(p);
return 0;
}
二、strlen的简介及用法
(1)strlen()是库函数,它计算的是字符串(char*)的字符个数,要引头文件 #include<string.h>.
(2)strlen()计算的是 '\0'前面的字符个数,而不包括'\0'.
(3)strlen与sizeof的区别,在计算字符串个数时,strlen以'\0'为结束标志,而sizeof则是你有多少个字符就计算多少个字符.
1.strlen()函数与操作符sizeof的区别
int main()
{
char str[] = { 'a','b','c','d','e','\0' };
//5,计算字符个数,遇到'\0'就停止,不包括'\0'
printf("%d\n", strlen(str));
//6,你有多少个字符就计算多少个字符
printf("%zu\n", sizeof(str));
return 0;
}
2.模拟实现strlen()函数
//模拟实现strlen()函数
int my_strlen(const char* str)
{
//断言,防止传入参数为空字符
assert(str);
char* p = str;
while (*str++);
return str - p - 1;
}
int main()
{
char str[] = "abcd";
int ret = 0;
ret = my_strlen(str);
printf("%d\n", ret);
return 0;
}
3.strlen()函数计算字符数组题型解析
int main()
{
char str[] = { 'a','b','c','d','e','f' };
//计算字符数组的字符个数,但是这里没有'\0',所以没有结束标志
//这里打印的是一个随机值,具体多少看内存布局
printf("%d\n", strlen(str));
//随机值,这里str是首元素地址(str + 0)还是首元素地址
printf("%d\n", strlen(str + 0));
//语法错误,对首元素解引用得到首元素地址的值'a',而不是地址
//strlen函数要求传入参数为一个值的地址,
printf("%d\n", strlen(*str));
//语法错误,str[1] <--> *(str + 1)得到也是一个值,而不是地址
printf("%d\n", strlen(str[1]));
return 0;
}
4.strlen()函数计算字符串题型解析
int main()
{
char str[] = "abcdefghi";
//9,str作为首元素地址,往后计算字符个数,遇'\0'停止
printf("%d\n", strlen(str));
//9,(str + 0)依旧为首元素地址,计算字符个数
printf("%d\n", strlen(str + 0));
//语法错误,对首元素解引用得到字符'a',而不是地址
printf("%d\n", strlen(*str));
//语法错误,str[1] <--> *(str + 1)与上例题一致
printf("%d\n", strlen(str[1]));
return 0;
}
版权声明:本文标题:C语言——sizeof与strlen用法 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.elefans.com/dianzi/1725766769a1041225.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论