区别
sizeof是C语言里面的关键字,strlen是C语言里面的库函数;
sizeof求的是类型的大小,strlen求的是有效字符串的大小;
sizeof不需要添加头文件,strlen要添加相关头文件;
sizeof在编译期间就可以算出来值的大小,是推断出来的,可能并没有进行运算,strlen在代码运行起来以后才知道值的大小
习题
int a[] = {1,2,3,4};
printf("%d\n",sizeof(a)); //16
//a代表整个数组,求的是数组的大小,a中共有4个元素,每个元素都是int类型,共占16字节
printf("%d\n",sizeof(a+1)); //4
//a代表首元素的地址,(a+1)代表第二个元素的地址,所以是4
printf("%d\n",sizeof(&a)); //4
//代表整个数组的地址,指针大小都是4字节
printf("%d\n",sizeof(*&a)); //16
//先对整个数组&再* 求的是整个数组的大小
数组名代表数组首元素的地址,在两种情况下,数组名代表整个数组,其一是sizeof,其二是&
char arr[] = {'a','b','c','d','e','f'};
printf("%d\n", sizeof(arr)); //6
//求的是数组大小
printf("%d\n", sizeof(arr+0)); //4
//求的是第0个元素的地址大小
printf("%d\n", strlen(arr)); //随机值
//strlen遇到'\0'才停止,该数组里面没有'\0',同下
printf("%d\n", strlen(arr+0));//随机值
char arr[] = "abcdef";
printf("%d\n", sizeof(arr)); //7
//整个数组的大小,还有一个'\0'
printf("%d\n", sizeof(arr+0)); //4
//数组第0个元素地址大小
printf("%d\n", strlen(arr));//6
//求字符串的长度,遇到'\0'停止
printf("%d\n", strlen(arr+0));//6
//遇到'\0'停止
char *p = "abcdef";
printf("%d\n", sizeof(p)); //4
//p是一个指针,求的是指针大小
printf("%d\n", strlen(p)); //6
//求字符串的长度,遇到'\0'停止
printf("%d\n", strlen(p+1)); //5
//p+1到b的地址,求的是字符串的长度,遇到'\0'停止
//二维数组
int a[3][4] = {0};
printf("%d\n",sizeof(a)); //48
//整个数组的大小,共有12个int类型的元素
printf("%d\n",sizeof(a[0])); //16
//求的是shuzudi0行的大小,共有4个int类型的元素
printf("%d\n",sizeof(a[0]+1)); //4
//a[0]+1还是一个地址
printf("%d\n",sizeof(a+1)); //4
//a是一个地址,加一还是一个地址
printf("%d\n",sizeof(a[3])); //16
//虽然并没有第3行,但是并不会报错,因为sizeof只是推断这个类型
//的大小,并没有真正去运行它
void Func(char str[100])
{
printf("%d\n", sizeof(str)); //4
}
//因为数组在传参的时候会退化成指针