一、字符数组
char arr[]="abc" ;后方自带\0"
而 arr[]={"a","b","c"};之后没有\0" 所以求长度时会有随机数的可能
二、字符数组杂症 实例
注释:
strlen是什么? 库函数 而sizeof 是操作符只关注占用空间大小,不关注存放什么
size_t strlen ( const char * str ); 传进去的参数是一个地址
返回值是字符串的长度,且是无符号的整型
注意:参数指向的字符串遇到“\0”结束,长度不包含\0"
char类型 占1个字节
1.第一型
char arr [] = { 'a' , 'b' , 'c' , 'd' , 'e' , 'f' };printf ( "%d\n" , sizeof ( arr ));计算的是arr内所有元素所占字节 =6printf ( "%d\n" , sizeof ( arr + 0 ));同第一节 地址所占字节大小 4或8printf ( "%d\n" , sizeof ( * arr ));*arr找到的是第一个元素地址 并且解引用 =1printf ( "%d\n" , sizeof ( arr [ 1 ])); =1printf ( "%d\n" , sizeof ( & arr ));整个字符串的地址 4或8printf ( "%d\n" , sizeof ( & arr + 1 )); 4或8printf ( "%d\n" , sizeof ( & arr [ 0 ] + 1 )); 同理第一节 4或8printf ( "%d\n" , strlen ( arr ));由于没有“\0”,strlen到\0才停止 所以=随机值printf ( "%d\n" , strlen ( arr + 0 )); 同理随机值printf ( "%d\n" , strlen ( * arr ));有问题 strlen 是库函数 只针对字符串printf ( "%d\n" , strlen ( arr [ 1 ])); 同上printf ( "%d\n" , strlen ( & arr ));取出的是这个字符串的地址,但不知道哪里出现\0 =随机值printf ( "%d\n" , strlen ( & arr + 1 )); 同理随机值printf ( "%d\n" , strlen ( & arr [ 0 ] + 1 )); 随机值
2.第二型
char arr [] = "abcdef" ;printf ( "%d\n" , sizeof ( arr ));同上 =7因为存在\0printf ( "%d\n" , sizeof ( arr + 0 )); =4或8printf ( "%d\n" , sizeof ( * arr )); =1printf ( "%d\n" , sizeof ( arr [ 1 ])); =1printf ( "%d\n" , sizeof ( & arr )); 4或8printf ( "%d\n" , sizeof ( & arr + 1 )); 4或8printf ( "%d\n" , sizeof ( & arr [ 0 ] + 1 )); 4或8printf ( "%d\n" , strlen ( arr ));到\0停止 =6printf ( "%d\n" , strlen ( arr + 0 ));向后跳转0个单位地址 依旧是原位置 所以还是=6printf ( "%d\n" , strlen ( * arr )); errorprintf ( "%d\n" , strlen ( arr [ 1 ])); errorprintf ( "%d\n" , strlen ( & arr )); =6printf ( "%d\n" , strlen ( & arr + 1 ));随机值因为跳过这个字符串地址后面是谁的地址未可知printf ( "%d\n" , strlen ( & arr [ 0 ] + 1 ));=5 第一个元素的地址向后一个元素开始 一共五个字符
3.第三型
char * p = "abcdef" ;printf ( "%d\n" , sizeof ( p ));p是一个指针变量 是一个地址 =4或8printf ( "%d\n" , sizeof ( p + 1 )); 4或8printf ( "%d\n" , sizeof ( * p ));*p 首元素地址解引用为a 占用1个字节 =1printf ( "%d\n" , sizeof ( p [ 0 ])); =1printf ( "%d\n" , sizeof ( & p ));以下均是地址 均是=8或4printf ( "%d\n" , sizeof ( & p + 1 ));printf ( "%d\n" , sizeof ( & p [ 0 ] + 1 ));
以下内容同第二型理解方式相似
printf ( "%d\n" , strlen ( p )); =6printf ( "%d\n" , strlen ( p + 1 )); =5printf ( "%d\n" , strlen ( * p )); errorprintf ( "%d\n" , strlen ( p [ 0 ])); errorprintf ( "%d\n" , strlen ( & p )); 随机值printf ( "%d\n" , strlen ( & p + 1 )); 随机值printf ( "%d\n" , strlen ( & p [ 0 ] + 1 )); =5