看以下代码:

#include <stdio.h>
void f(char**);
int main()
{
char *argv[] = { "ab", "cd", "ef", "gh", "ij", "kl" };
f(argv);
return 0;
}
void f(char **p)
{
char *t;
t = (p += sizeof(int))[-1];
printf("%s\n", t);
}

 

觉得执行后的值为多少呢?

正确答案为: gh

这里用到了double指针,也就是把指针的变量值传递给只接受指针参数的函数f(char**),函数里面的double 指针p最终结果是指向一个已经分配好值的数组单元。这个数组为["ab", "cd", "ef", "gh", "ij", "kl"]。

定位到函数f(char **p),里面有一句话: t = (p += sizeof(int))[-1]。这里先将p指针移动一下位置,把p的地址递增了4个字节。由于最初的p指针指向了数组的第一个元素ab,这里移动了4个字节,那么就是从ab元素后面再数4个元素,也就定位到了ij元素。然后执行[-1]操作,这个操作等价于(p-1),意思是把指针往前面移动一个位置,也就是定位到了gh。注意了,一般看到p[-1]这种写法,其实把它看作(p-1)就好了。

最后是输出结果,这里当然为gh。(前提是int类型等于4个字节)

最新文章

  1. Linq to Sql 聚合查询
  2. Android 优化List图片显示
  3. fFFmpeg 命令、案例、测试集中营
  4. 继承多态绕点 C#篇
  5. Ubuntu 14.10 下卸载MySQL
  6. repeater标签双重循环的使用
  7. 2、@RequestMapping注解的用法
  8. sort()排序
  9. MFC DLL资源动态切换
  10. [LeetCode] Search in Rotated Sorted Array II [36]
  11. this指针是什么?
  12. SpringMVC之拦截器实现登录验证
  13. 微信小程序上传后发布或者体验版测试无数据解决办法
  14. 翻译:MySQL &quot;Got an Error Reading Communication Packet&quot; Errors
  15. CAN总线芯片SN65HVD230QD介绍
  16. MyBatis初探
  17. 由一个“两次请求”引出的Web服务器跨域请求访问问题的解决方案
  18. 伪类target实现纯css模态框
  19. python 文件路径名,文件名,后缀名的操作
  20. python输出格式对齐问题

热门文章

  1. (水题)Codeforces - 630H - Benches
  2. SSM报错:No converter found for return value of type: class java.util.ArrayList at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor.writeWithMessageConverter
  3. iOS Swift3 用全局“宏”时要注意的问题
  4. 利用uiautomator实现Android移动app启动时间的测试
  5. nginx中常见的变量
  6. 第一章、 CLR的执行模型
  7. 数据库SQL server 删除一张表中的重复记录
  8. CCF|学生排队|Java
  9. 第一章 熟悉Objective -C 编写高质量iOS与OS X代码的52 个有效方法
  10. RFS自动化测试(一)