指针进阶之疑难杂症 第二节

一、字符数组

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内所有元素所占字节 =6
printf ( "%d\n" , sizeof ( arr + 0 )); 
同第一节  地址所占字节大小 4或8
printf ( "%d\n" , sizeof ( * arr )); 
*arr找到的是第一个元素地址 并且解引用 =1
printf ( "%d\n" , sizeof ( arr [ 1 ]));   =1
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" , 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因为存在\0
printf ( "%d\n" , sizeof ( arr + 0 ));  =4或8
printf ( "%d\n" , sizeof ( * arr ));  =1
printf ( "%d\n" , sizeof ( arr [ 1 ]));  =1
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" , strlen ( arr )); 
到\0停止 =6
printf ( "%d\n" , strlen ( arr + 0 )); 
向后跳转0个单位地址 依旧是原位置 所以还是=6
printf ( "%d\n" , strlen ( * arr ));           error
printf ( "%d\n" , strlen ( arr [ 1 ]));         error
printf ( "%d\n" , strlen ( & arr ));    =6
printf ( "%d\n" , strlen ( & arr + 1 ));     
随机值因为跳过这个字符串地址后面是谁的地址未可知
printf ( "%d\n" , strlen ( & arr [ 0 ] + 1 ));       
=5  第一个元素的地址向后一个元素开始 一共五个字符

3.第三型

char * p = "abcdef" ;
printf ( "%d\n" , sizeof ( p )); 
p是一个指针变量 是一个地址 =4或8
printf ( "%d\n" , sizeof ( p + 1 ));  4或8
printf ( "%d\n" , sizeof ( * p ));
*p 首元素地址解引用为a 占用1个字节 =1
printf ( "%d\n" , sizeof ( p [ 0 ])); =1
printf ( "%d\n" , sizeof ( & p ));   
以下均是地址   均是=8或4
printf ( "%d\n" , sizeof ( & p + 1 ));
printf ( "%d\n" , sizeof ( & p [ 0 ] + 1 ));
以下内容同第二型理解方式相似
printf ( "%d\n" , strlen ( p ));                =6
printf ( "%d\n" , strlen ( p + 1 ));            =5
printf ( "%d\n" , strlen ( * p ));               error
printf ( "%d\n" , strlen ( p [ 0 ]));             error
printf ( "%d\n" , strlen ( & p ));              随机值
printf ( "%d\n" , strlen ( & p + 1 ));          随机值
printf ( "%d\n" , strlen ( & p [ 0 ] + 1 ));      =5
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值