sizeof:
是操作符,不是函数。
计算变量所占的内存空间的大小,单位是字节,如果是类型的话,计算的是使用类型创建所占空间的大小。
只关注内存空间,不管什么类型。
strlen:
是函数(库函数):求字符串的长度,只能针对字符串(字符数组)
统计字符串中**"\0**"前的字符个数。关注是否有"\0",如果没有,会持续往后找 ,可能会越界。
例题:
int main(){
char arr1[]={'a','b','c'};
char arr2[]="a b c"; //末尾有隐藏的\0
printf("%zd\n",strlen(arr1)); //随机值,因为找不到\0会一直往下找,会出现随机值。
printf("%zd\n",strlen(arr2)); // 3
printf("%zd\n",sizeof(arr2)); // 3
printf("%zd\n",sizeof(arr2)); // 4
数组和指针:
整型数组:
数组名是首元素地址,除了"sizeof(数组名)"和"&(数组名)"
int main(){
int a[]={1,2,3,4};
pritnf("%zd\n",sizeof(a)); //16 因为数组名a单独在sizeof的内部 ,a表示整个数组。
pritnf("%zd\n",sizeof(a+0)); //4或者8 数组名+0还是首元素地址,看是X64,还是X86.
pritnf("%zd\n",sizeof(*a)); //4 a表示首元素地址,但是*a就是首元素a[0]。
pritnf("%zd\n",sizeof(a+1)); //4或者8 首元素地址+1,表示a[1].
pritnf("%zd\n",sizeof(a[1])); //4 就是表示元素a[1]。
pritnf("%zd\n",sizeof(&a)); //4或者8. &a--整个数组地址,只要是地址就是4或者8.
pritnf("%zd\n",sizeof(*&a)); //16 其中的*和&相互低消了,就是访问的整个数组a
pritnf("%zd\n",sizeof(&a+1)); //4或者8. &a+1--就是表示跳过整个数组后那个位置的地址。
pritnf("%zd\n",sizeof(&a[0])); //4或者8.
pritnf("%zd\n",sizeof(&a[0]+1));//4或者8. 首元素+1就是第二个元素的地址。
以上有关只要是地址就是4或者8 的可以去看7月 30号"c语言中的指针变量大小,以及指针类型的意义"文章里面有介绍。
字符数组
int main(){
char arr[]={'a','b','c','d','e','f'};
printf(%d\n",sizeof(arr)); //6 数组单独放在sizeof里面表示整个数组
printf(%d\n",sizeof(arr+0)); //4或者8 数组名表示首元素地址
printf(%d\n",sizeof(*arr)); //1 arr表示首元素地址,*arr就是首元素
printf(%d\n",sizeof(&arr)); //4或者8 &(数组)是整个数组。
printf(%d\n",sizeof(&arr+1)); //4或者8 表示跳过整个数组后的位置的地址
printf(%d\n",sizeof(&arr[0]+1));//4或者8
printf(%d\n",sizeof(arr)); //随机值 若是没有发现**'\0'**就会继续往下找。
printf(%zd\n",strlen(arr+0)); //随机值
printf(%zd\n",strlen(*arr)); //'a'--97直接系统崩了,传给strlen,会以为97是地址,就去访问。
printf(%zd\n",strlen(arr[1])); //同上
printf(%zd\n",strlen(&arr)); //随机值 取数组的地址
printf(%zd\n",strlen(&arr+1)); //随机值
printf(%zd\n",strlen(&arr[0]+1)); //随机值
return 0;
}