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;
}

本文标签: 语言sizeofstrlen