C指针与数组之间的细节
2024-09-02 21:23:23
看以下代码:
#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个字节)
最新文章
- Linq to Sql 聚合查询
- Android 优化List图片显示
- fFFmpeg 命令、案例、测试集中营
- 继承多态绕点 C#篇
- Ubuntu 14.10 下卸载MySQL
- repeater标签双重循环的使用
- 2、@RequestMapping注解的用法
- sort()排序
- MFC DLL资源动态切换
- [LeetCode] Search in Rotated Sorted Array II [36]
- this指针是什么?
- SpringMVC之拦截器实现登录验证
- 微信小程序上传后发布或者体验版测试无数据解决办法
- 翻译:MySQL ";Got an Error Reading Communication Packet"; Errors
- CAN总线芯片SN65HVD230QD介绍
- MyBatis初探
- 由一个“两次请求”引出的Web服务器跨域请求访问问题的解决方案
- 伪类target实现纯css模态框
- python 文件路径名,文件名,后缀名的操作
- python输出格式对齐问题
热门文章
- (水题)Codeforces - 630H - Benches
- SSM报错:No converter found for return value of type: class java.util.ArrayList 	at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor.writeWithMessageConverter
- iOS Swift3 用全局“宏”时要注意的问题
- 利用uiautomator实现Android移动app启动时间的测试
- nginx中常见的变量
- 第一章、 CLR的执行模型
- 数据库SQL server 删除一张表中的重复记录
- CCF|学生排队|Java
- 第一章 熟悉Objective -C 编写高质量iOS与OS X代码的52 个有效方法
- RFS自动化测试(一)