arrays - 难以理解高级指针算术语法
问题描述
假设我们得到了下一个设置:
int (*p)[9];
它是一个常规指针,还是某种指向
9*sizeof(int)
大内存块的特殊指针?我如何引用这种语法?
假设我有一个给定的矩阵:
int mat[200][9];
int (*p)[9] = mat;
指针算术如何使用它,例如,如果我们要增加 p
我如何转换为这种类型?
下一个代码的输出是
2 5
,我认为它有一个链接到我上面显示的特殊语法。有人可以向我解释为什么不是输出2 1
吗?
int main()
{
int a[5] = {1,2,3,4,5};
int *ptr = (int*)(&a+1);
printf("%d %d", *(a+1), *(ptr-1));
return 0;
}
解决方案
你应该阅读
int (*p)[9];
int [9]
作为指向(9 个整数)数组的指针。它是一个常规指针,类型为int [9]
.
指针算术将与其他指针的情况一样工作,基于指针的大小,即sizeof(int[9])
.
也就是说,对于另一个问题,如有疑问,请检查数据类型!
int main()
{
int a[5] = {1,2,3,4,5};
int *ptr = (int*)(&a+1);
printf("%d %d", *(a+1), *(ptr-1));
return 0;
}
&a
是 if type int (*)[5]
,所以指针算术将尊重这一点。&a+1
指向整个数组之后的第一个元素。
因此,自然地,ptr
指向最后一个元素地址之后的一个。所以,通过说*(ptr-1)
会得到最后一个元素的值,即5
.
推荐阅读
- angular - Angular 5 async-await 未按预期等待
- javascript - 在 Javascript 中为所有 http 请求添加自定义标头
- go - 在 go 中下载并执行二进制文件
- javascript - 如何有效地将二进制数据存储在 .js 源文件中?
- svg - SVG过滤器:不同的颜色取决于浏览器
- c# - SendAsync 正在阻塞 UI 线程
- kubernetes - 从自签名转换为商业证书 TLS 错误
- sql - 特殊字符或仅字符/数字的测试列
- apache-spark - 数据框中列的匹配值
- api - 使用 KUDU Client API 创建表时,如何设置主键的列顺序?