size of:是统计对象所占的存储单元(字节)个数的运算符。在程序编译阶段得出其值。用于表示字符串长度时所得结果包含字符\0的长度。
参数可以是指针、数组、类型、对象和函数等。
strlen:一般用来统计字符串中字符的个数的函数,且只能用于计算字符串的长度,用于表示从当前位到字符\0(不包含字符\0)所占的字符个数。
参数必须是字符型指针(char*)。当数组名作为参数传入时,实际上数组就隐式转化为指针了。
下面用一些示例来具体说明:
int a[] = {1,2,3,4};
printf("%d\n", sizeof(a));//该数组长所占字节数为4*4=16
printf("%d\n", sizeof(a + 0));//当a+0时,a便隐式转换成了指针,此时计算首元素所占字节数。答案为4
printf("%d\n", sizeof(*a));//*a指向数组a的整形元素1,该元素占4个字节,
printf("%d\n", sizeof(a + 1));//同2
printf("%d\n", sizeof(a[1]));//计算第二个整形元素2所占字节数
printf("%d\n", sizeof(&a));//指针4字节
printf("%d\n", sizeof(*&a));//*与&互相抵消,然后原理同1
printf("%d\n", sizeof(&a + 1));//计算第二个整形元素2所占字节数
printf("%d\n", sizeof(&a[0]));//首元素地址所占字节数,即指针
printf("%d\n", sizeof(&a[0] + 1));//首元素地址加1,即向后移动四个字节,,仍为指针类型。
char arr[] = { 'a','b','c','d','e','f' };
printf("%d\n", sizeof(arr));//6 共计六个字符
printf("%d\n", sizeof(arr + 0));//4 arr隐式转化为指针
printf("%d\n", sizeof(*arr));//char型a元素占1个字节
printf("%d\n", sizeof(arr[1]));//b占一个字节
printf("%d\n", sizeof(&arr));//指针占4字节
printf("%d\n", sizeof(&arr + 1));//同上
printf("%d\n", sizeof(&arr[0] + 1));//同上
printf("%d\n", strlen(arr));//strlen寻找的时\0,此数组中不含该字符\0,所以结果不确定
printf("%d\n", strlen(arr + 0));//同上
printf("%d\n", strlen(*arr));//*arr为char型,而strlen()需要的是char*型,
printf("%d\n", strlen(arr[1]));//
printf("%d\n", strlen(&arr));
printf("%d\n", strlen(&arr + 1));&arr + 1跳过整个数组。
printf("%d\n", strlen(&arr[0] + 1));
char arr[] = "abcdef";
printf("%d\n", sizeof(arr));//加上\0共七个字节
printf("%d\n", sizeof(arr+0));//4
printf("%d\n", sizeof(*arr));//1
printf("%d\n", sizeof(arr[1]));//1
printf("%d\n", sizeof(&arr));//4
printf("%d\n", sizeof(&arr+1));//4
printf("%d\n", sizeof(&arr[0]+1));//4
printf("%d\n", strlen(arr));//6不包含/0
printf("%d\n", strlen(arr+0));//6
printf("%d\n", strlen(*arr));//得到的char与char*类型不匹配
printf("%d\n", strlen(arr[1]));//同上
printf("%d\n", strlen(&arr));//得到的是char(*)[7]数组指针,&arr与arr碰巧得到相同值
printf("%d\n", strlen(&arr+1));//&arr + 1跳过整个数组。UB
printf("%d\n", strlen(&arr[0]+1));//5
char *p = "abcdef";
printf("%d\n", sizeof(p));//4
printf("%d\n", sizeof(p+1));//4
printf("%d\n", sizeof(*p));//1
printf("%d\n", sizeof(p[0]));//1
printf("%d\n", sizeof(&p));//4
printf("%d\n", sizeof(&p+1));//4
printf("%d\n", sizeof(&p[0]+1));//4
printf("%d\n", strlen(p));//6
printf("%d\n", strlen(p+1));//5
printf("%d\n", strlen(*p));//UB
printf("%d\n", strlen(p[0]));//UB
printf("%d\n", strlen(&p));//UB char**
printf("%d\n", strlen(&p+1));//UB char**
printf("%d\n", strlen(&p[0]+1));//5
来源:CSDN
作者:血细胞凝集抑制反应
链接:https://blog.csdn.net/weixin_44131194/article/details/104676601