char arr[]={'a','b','c','d','e','f'}的strlen的使用
#include<string.h> int main() { char arr[] = { 'a','b','c','d','e','f'}; printf("%d\n", strlen(arr));//随机值,因为不知道\0的位置 printf("%d\n", strlen(arr + 0));//随机值 printf("%d\n", strlen(*arr));//非法访问 printf("%d\n", strlen(arr[1]));//'b' - 98当成地址,形参非法访问 printf("%d\n", strlen(&arr));//随机值 printf("%d\n", strlen(&arr + 1));//随机值 - 6 printf("%d\n", strlen(&arr[0] + 1));//随机值 - 1 return 0; }
1.strlen(arr)
数组名没有单独放在sizeof内部,因为这是strlen,这时就从第一个元素'a'这个地址开始统计,直到遇到'\0'的地址停止,但是这个数组没有存'\0',所以'\0'的地址在内存中的位置是随机存放的,所以结果是随机值
运行结果:
2.strlen(arr + 0)
没有取值地址,没有单独放在sizeof内部,+0还是指向'\a'位置,所以结果还是随机值
运行结果:
3.strlen(*arr)
*arr得到了首元素'a',对应的ascll码值是 -- 97,是整型类型,而strlen的参数必须是 char* 类型,
所以就是非法访问了
运行结果:
4.strlen(arr[1])
数组第二个元素,也就是'b',其对应的ascll码值为98,非法访问
运行结果:
关于1和2点以下图解:
strlen的参数必须是 char* 类型
5.strlen(&arr)
数组的地址,跟1和2点的值是一样的,随机值
运行结果:
6.strlen(&arr + 1)
随机值- 6
运行结果:
7.strlen(&arr[0] + 1)
随机值 - 1
运行结果:
字符串的sizeof和strlen
char arr="abcdef"的sizeof的使用
前提:
sizeof会根据数据类型进行计算
特殊:
'\0'这个放进去数组里面,如果是字符数组,那它的字节大小就是1,如果是整型数组那它的字节大小就是4
也就是说,无论里面放什么类型的数据,sizeof的统计是按数组的大小去统计的,不关心数据类型
图解:
int main() { char arr[] = "abcdef"; printf("%d\n", sizeof(arr)); printf("%d\n", sizeof(arr+0)); printf("%d\n", sizeof(*arr)); printf("%d\n", sizeof(arr[1])); printf("%d\n", sizeof(&arr)); printf("%d\n", sizeof(&arr+1)); printf("%d\n", sizeof(&arr[0]+1)); return 0; }
1.sizeof(arr)
统计结果整个数组大小:7
运行结果:
2.sizeof(arr + 0)
arr+0是首元素地址,是地址大小为4/8
运行结果:
3.sizeof(*arr)
字符数组第一个元素大小:1
arr[0] ==*arr== *(arr+0)
计算数组大小另一种方式:
总数/首元素: int sz= sizeof(arr)/sizeof(*arr) <==> sizeof(arr)/sizeof(arr[0])
运行结果:
4. sizeof(arr[1])
字符数组第二个元素大小:1
运行结果:
5.sizeof(&arr)
数组的地址,是地址就是4/8byte
运行结果:
6.sizeof(&arr + 1)
跳过一个数组,依然是地址,大小4/8byte
运行结果:
7. sizeof(&arr[0] + 1)
字符数组第二个元素地址,4/8字节
运行结果:
sizeof(字符串) 与 sizeof ( 数组 )的区别
区别:字符串比字符数组存储时要多一个'\0'
sizeof(字符串):
char arr[] = "abcdef"; printf("%d\n", sizeof(arr));
双引号会在尾部自动添加转义字符'\0',即数据0X00,所以结果是7
双引号作用: (1)字符串尾部加0, (2)开辟内存空间, (3)提取地址
sizeof ( 数组 ):
返回数组的大小,因为arr1[]没有写入数字,所以就按照字符个数统计
下面是[]写入数据的情况:
sizeof ( 数组 ):
char arr[50] = { 'a','b','c','d','e','f' }; printf("%ld", sizeof(arr));
因为数组的下标长度是50,所以返回数组总字节大小
char arr="abcdef"的strlen的使用
int main(){ char arr[] = "abcdef"; printf("%d\n", strlen(arr)); printf("%d\n", strlen(arr+0)); printf("%d\n", strlen(*arr)); printf("%d\n", strlen(arr[1])); printf("%d\n", strlen(&arr)); printf("%d\n", strlen(&arr+1)); printf("%d\n", strlen(&arr[0]+1)); return 0; }
1.strlen(arr)
数组名没有单独放在sizeof内部,这是strlen,所以表示为数组首元素地址
运行结果:
2.strlen(arr + 0)
没有距离上的跨越,依旧是数组首元素地址,
运行结果:
3.strlen(*arr)
数组第一个元素'a',strlen需要的是地址,错误
运行结果:
4.strlen(arr[1])
数组第二个元素'b',strlen需要的是地址,错误
运行结果:
5.strlen(&arr)
会报出警告:这里的&arr取出的地址所用的指针类型是 char(*)[7]
然而strlen的参数类型是const char*
不影响使用,strlen会转化成它所适配的类型
运行结果:
6.strlen(&arr + 1)
跳过了一个数组,注意是连'\0'也跳过了,那就是随机值了
运行结果:
7.strlen(&arr[0] + 1)
看上图,数组第二个元素地址,向后数到'\0',5个数
运行结果: