c++中复杂地址解析及字符串初始化字符数组的小细节

关于这道题  求出打印出的是什么

const char *c[] = {"HELLO", "NEW", "WORLD", "SAYHI"};
const char **cp[] = {c + 3, c + 2, c + 1, c};
const char ***cpp = cp;  这里就是cp和cpp完全相等  cpp指向cp第一项
printf("%s,", **++cpp);  结束后cpp指向cp第二项
printf("%s,", *--*++cpp + 3);  结束后cpp指向cp第三项
printf("%s,", *cpp[-2] + 3);  cpp指向cp第三项
printf("%s\n", cpp[-1][-1] + 1);  cpp指向cp第三项


c是一个指针数组  所以c[0]取出来是HELLO的指针,那么c[0][0]就是H
c = {指向HELLO的指针,指向NEW的指针,指向WORLD的指针,指向SAYHI的指针};
c+3是什么呢,c是c数组中第一项的地址,那么c+3就可以理解为是c数组的第四项就是SAYHI的地址
cpp是一个最终指向char的二级指针数组,就是说cp数组里放的都是二级指针,毕竟c是char数组指针的指针


**++cpp  刚开始cpp是cp第一项的地址,可以知道++cpp就是c+2的地址,c+2又是c数组中第三项的地址,那么解一层拿到c数组中第三项的地址,再解一层拿到c数组中第三项WORLD
*--*++cpp + 3   因为在之前cpp已经增过了,所以这里++cpp就是c+1的地址,解一层拿到c+1也就是c数组中第二项的地址
这时候地址--就变成c数组中第一项的地址,解一层拿到c数组中的第一项HELLO数组的地址,这时+3地址变化指向第二个L所以输出是LO
*cpp[-2] + 3  cpp[-2]现在就是cp第一项c+3,c+3就是c第四项SAYHI的地址,解一层拿到SAYHI数组的地址,+3所以输出HI
cpp[-1][-1] + 1   cpp[-1]现在就是cp的第二项c+2,也就是c数组中第三项的地址,现在再来个[-1]就是这个地址-1然后解地址,解出来就是数组NEW的地址,+1输出EW
 

关于符串初始化字符数组的小细节

字符串结束标志\0  字符数组没有这个强制要求 
但用字符串初始化字符数组定义的时候,数组最后一个元素自动为\0
char str1[] = "str1";  sizeof(str1) = 5 
但是如果你用字符以下方这种方式初始化字符数组的时候最后一个不会为\0  可以编译通过
char str2[] = {'s', 't', 'r', '1'};
啊但是,如果你直接cout<<str2会发现他会打出乱码  比如这种字:烫  因为没有找到\0结束
所以在用字符初始化时一定要手动加上最后一位为\0 像这个样子
char str2[] = {'s', 't', 'r', '1', '\0};
某些题说用字符初始化时\0是必须的,我觉得得说是为了程序正确才必须,而并不是编译必须

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值