Bootstrap

C语言中strlen和sizeof的区别

1.strlen是一个库函数使用时需要引用#include<string.h>这个头文件,而sizeof是一个运算符号;

2.strlen计算的是'\0'之前的字符个数,sizefo计算的是所占空间内存的大小,单位是字节;

3.strlen计算时不包含'\0',而sizeof包含'\0';

4.strlen遇到'\0'才结束;

5.sizeof的类型是unsigned int ,是一个无符号的整型;

6.strlen只能用char做参数,sizeof可以用类型做参数;

strlen的使用:

#include<stdio.h>
#include<string.h>//使用strlen时引用的头文件
int main()
{
	char arr1[] = "hello";
	char arr2[] = { 'h','e','l','l','o' };
	char arr3[] = { 'h','e','l','l','o','\0'};
	printf("%d\n", strlen(arr1));
	printf("%d\n", strlen(arr2));//随机值,只有遇到'\0'才结束,而arr2中没有'\0'
	printf("%d\n", strlen(arr3));
}

打印结果:

#include<stdio.h>
int main()
{
	//strlen只有在遇到'\0'时才结束
	char arr[] = { 'a','b','c','d','e','f' };
	printf("%d\n", strlen(arr));//随机值
	printf("%d\n", strlen(arr+0));//随机值
	printf("%d\n", strlen(&arr));//随机值
	printf("%d\n", strlen(&arr+1));//随机值-6
	printf("%d\n", strlen(&arr[0]+1));//随机值-1
	//printf("%d\n", strlen(*arr));//error
	//printf("%d\n", strlen(arr[1]));//error
}

打印结果:

sizeof的使用:  


#include<stdio.h>
int main()
{
    //sizeof计算占用内存空间大小时,会计算'\0'的大小
	int arr1[10]={1,2,3,4,5};
	char arr2[]="hello";//字符串后默认有个'\0'
	char arr3[]={'h','e','l','l','o'};//字符后没有'\0'
    int arr4[]={0};
	printf("%d\n",sizeof(arr1));
	printf("%d\n",sizeof(arr2));
	printf("%d\n",sizeof(arr3));
	printf("%d\n",sizeof(int));
	return 0;
 } 

 打印结果:

 下面来看两组题目:(sizeof在一维数组中的使用)

#include<stdio.h>
int main()
{
	//32位平台下,int为4个字节,在64位平台下,int为8个字节
	//数组名表示首元素地址;两个除外  1.sizeof(数组名),表示整个数组的大小;  2.&数组名,表示整个数组的地址
	int a[] = { 1,2,3,4 };//4*4=16
	printf("%d\n", sizeof(a));//16 ,sizeof(数组名),表示整个数组的大小
	printf("%d\n", sizeof(a+0));//4/8 ,数组名表示首元素地址,a+0还是首元素地址,地址的大小就是4/8
	printf("%d\n", sizeof(*a));//4 ,*a代表首元素,大小就为4
	printf("%d\n", sizeof(a+1));//4/8 ,首元素地址+1为第2个元素的地址,地址的大小就是4/8
	printf("%d\n", sizeof(a[1]));//4 ,第2个元素的大小,大小为4
	printf("%d\n", sizeof(&a));//4/8 ,取的是整个数组的地址,地址的大小就是4/8
	printf("%d\n", sizeof(*&a));//16 ,&a取是的地址,数组的地址解引用访问的数组,sizeof计算的就是整个数组的大小
	printf("%d\n", sizeof(&a+1));//4/8 ,&a代表整个数组的地址,+1就是跳过整个数组,但还是地址,地址大小就是4/8
	printf("%d\n", sizeof(&a[0]));//4/8 ,a[0]是首元素地址,地址的大小就是4/8
	printf("%d\n", sizeof(&a[0]+1));//4/8 ,数组的第二个地址,地址的大小就是4/8

 在32位平台和64位平台下打印的结果:

sizeof在二维数组中的使用:

#include<stdio.h>
int main()
{
	int a[3][4] = { 0 };
	printf("%p\n", &a[0][0]);//首地址
	printf("%p\n", a[0]+1);//第一行第二个的地址
	printf("%p\n", a+1);//第二行的首地址
	printf("%p\n", &a[0]+1);//第二行的首地址

	printf("%d\n", sizeof(a));//48,sizeof(数组名),表示整个数组的大小
	printf("%d\n", sizeof(a[0][0]));//4,首元素的大小
	printf("%d\n", sizeof(a[0]));//16,第一行的大小,相当于第一行作为一维数组的数组名
	printf("%d\n", sizeof(a[0]+1));//4,a[0]是第一行的数组名,数组名此时是首元素的地址,a[0]其实就是第一行第一个元素的地址,所以a[0]+1是第一行第二个元素的地址,地址大小是4/8
	printf("%d\n", sizeof(*(a[0]+1)));//4,第一行第二个元素的大小
	printf("%d\n", sizeof(a+1));//4,第二行首元素大小,a是二维数组的数组名,没有sizeof(a),也没有&(a),所以a是首元素的地址,二维数组的首地址是第一行,a就是第一行(首元素)的地址,a+1就是第二行的首地址
	printf("%d\n", sizeof(*(a + 1)));//16,第二行的大小
	printf("%d\n", sizeof(&a[0] + 1));//4,第二行的首地址
	printf("%d\n", sizeof(*(&a[0] + 1)));//16,第二行的大小
	printf("%d\n", sizeof(*a));//16,a是首元素的地址,第一行的地址,就是计算*a第一行的大小
	printf("%d\n", sizeof(a[3]));//16,第三行的大小

}

 打印结果:

 总结:

        上面说了sizeof和strlen的区别和使用方法,需要我们特别注意的是,srtlen只有在遇到'\0'时,才会结束,就是只计算'\0'之前的字符,所以我们在使用时一定要记得加上'\0';在使用sizeof时,我们必须要记住,数组名是首元素地址,有两个除外1.sizeof(数组名),计算的是整个数组的大小,单位是字节;2. &数组名,表示的是整个数组的地址。

;