欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 文化 > C ——— 指针笔试题(最终篇)

C ——— 指针笔试题(最终篇)

2024/11/30 12:30:17 来源:https://blog.csdn.net/weixin_55341642/article/details/140854707  浏览:    关键词:C ——— 指针笔试题(最终篇)

指针加减整数和解引用的笔试题

boss题:

char* c[] = { "ENTER","NEW","POINT","FIRST" };
char** cp[] = { c + 3,c + 2,c + 1,c };
char*** cpp = cp;printf("%s\n", **++cpp);
printf("%s\n", *-- * ++cpp + 3);
printf("%s\n", *cpp[-2] + 3);
printf("%s\n", cpp[-1][-1] + 1);

代码解析:

c数组中存放了4个元素,每个元素是char*类型的地址,c数组并不是存放的4个常量字符串,而是存放的每个字符串的首字符的地址,所以c数组的每个元素是char*

cp数组中存放的是4个char** 类型的元素,c + 3 指向的是 "FIRST" 这个常量字符串中的 'F' 字符的首地址,c + 2 指向的是 "POINT" 这个常量字符串中的 'P' 字符的首地址,c + 1 指向的是 "NEW" 这个常量字符串中的 'N' 字符的首地址,c 指向的是 "ENTER" 这个常量字符串中的 'E' 字符的首地址

cpp数组存储的是cp数组的首元素地址

各个数组的关系示意图:

解析:**++cpp 

cpp 指向的是cp数组首元素地址,++cpp后指向了 cp数组第二个元素的首地址,*++cpp 解引用后找到的是 cp数组中 存储的第二个元素的地址,也就是 c + 2,**++cpp再次解引用后找到的就是c数组中的第三个元素的地址,以%s的形式打印,打印的就是c数组中的第三个常量字符串

所以 **++cpp 以%s的形式打印的结果是 "POINT" 

注意: ++cpp时,cpp就已经发生了改变,在此之后的cpp就指向了cp数组第二个元素的首地址

解析:*-- * ++cpp + 3

解析这个的结果之前,先要了解 ++ 和 * 和 -- 的优先级都高于+,所以要从cpp开始依次往左计算,最后再算 + 3 

此时的cpp指向的是cp数组中第二个元素的首地址,再次++cpp后,指向的就是cp数组中第三个元素的首地址,*++cpp 解引用后就拿到了 c + 1,也就是c数组第二个元素的首地址,--*++cpp 前置减减后就指向了c数组中第一个元素的首地址,*--*++cpp 解引用后拿到的是c数组中第一个常量字符串的首地址,最后再 +3,也就是从 "ENTER" 的首字符 'E' 中向后跳过 3个字符,得到的就是字符串 "ER"

所以 *-- * ++cpp + 3 以%s的形式打印的结果是 "ER"

注意:此时的cpp已经指向了cp数组中第三个元素的首地址

解析:*cpp[-2] + 3

[] 的优先级高于 * ,所以cpp先和[-2]结合,cpp[-2] 等价于 *(cpp - 2) ,cpp - 2后指向的是cp数组第一个元素的地址,*(cpp - 2) 解引用后找到的是 cp数组的第一个元素,也就是c + 3,*cpp[-2] 解引用后找到的是 c数组中的第四个元素,也就是 "FIRST" 中 'F' 字符的首地址,最后再+3,也就是从 'F' 字符向后跳过 3个字符,打印的就是 "ST"

所以 *cpp[-2] + 3 以%s的形式打印的结果是 "ST"

解析:cpp[-1][-1] + 1 

cpp[-1][-1] 等价于 *(*(cpp - 1) - 1) ,此时的cpp指向的是cp数组中第三个元素的首地址,cpp - 1后指向的是 cp数组中第二个元素的首地址,*(cpp - 1) 解引用后找到的是cp数组中的第二个元素,也就是c + 2 ,*(c + 2 - 1) 得到的是c数组中第二个元素,也就是 "NEW" 字符串,最后再加1,也就是从 'N' 字符向后跳过一个字符,指向的就是 "EW"

所以 cpp[-1][-1] + 1 以%s的形式打印的结果是 "EW"

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com