关于这道题? 求出打印出的是什么
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是必须的,我觉得得说是为了程序正确才必须,而并不是编译必须
|