sizeof() VS strlen()
首先我们看看 sizeof 和 strlen 的区别?
- sizeof 在编译时候就已经计算好所占字节了,不去访问内存;但是 strlen 只有在运行的时候才能计算长度;
- sizeof是运算符,strlen是函数。
- sizeof 操作符的结果类型是 size_t,它在头文件中 typedef 为unsigned int类型。该类型保证能容纳实现所建立的最大对象的字节大小。
- sizeof可以用类型做参数,strlen只能用char*做参数,且必须是以’’\0’'结尾的;sizeof还可以用函数做参数,
- 数组做 sizeof 的参数还是数组,但是如果传递给 strlen 为指针了。
- sizeof 会计算 ‘ \0 ’,但是 strlen 不会把 ‘ \0 ’ 包含在内
下面是具体的实例,指针所占字节数在32位操作系统下是4个字节;在64位操作系统下为8个字节;这里一律按 32 位操作系统
//sizeof判断元素所占的空间的字节
//printf("%d\n", sizeof(a));//16
//a是一个数组名,1个元素4个字节
int a[] = {
1,2,3,4 };
//数组名a+0之后会被隐式转换位指针,//32位系统下,为4
printf("%d\n", sizeof(a + 0));
//a转换为指针(隐式转换为首元素的指针),解引用得到的元素是1为int型
printf("%d\n", sizeof(*a));
printf("%d\n", sizeof(a + 1));//4
printf("%d\n", sizeof(a[1]));//a[1]代表的元素是2int型,所占字节为4
//得到2之后,取地址之后为一个指针;4
printf("%d\n", sizeof(&a[1]));
//数组名取地址是一个指针,称数组指针,在32位系统是4
printf("%d\n", sizeof(&a));
//16 先取地址得到的是数组指针,在解引用返回了数组。
printf("%d\n", sizeof(*&a));
//4; 先解引用得到的是1 (int型),然后取地址得到一个指针。
printf("%d\n", sizeof(&*a));
//4 a取地址位数组指针,数组指针加一为也为指针。
printf("%d\n", sizeof(&a + 1));
//4 只要计算指针,在32位系统下就为4.
printf("%d\n", sizeof(&a[0]+1));
char arr[] = {
'a','b','c','d','e','f' }