对于以下代码:
#include <stdio.h> int main() { int a[][3] = {1,2,3,4,5,6}; int (*ptr)[3] = a; printf("%d %d ",(*ptr)[1],(*ptr)[2]); ++ptr; printf("%d %d\n",(*ptr)[2]); return 0; }
应该打印什么?我期待:
2 3 3 4
但输出是:
2 3 5 6
我期待输出为2 3 3 4
因为最初ptr指向双维数组a [] [3]的第一行.因此,第一个printf的(* ptr)[1]会给我们2个,就像明智的(* ptr)[2]会给我们3.但是在ptr行之后它会开始指向第一行的第二个元素[ ] [3].因此,第二行的(* ptr)[1]现在应该给我们3,同样(* ptr)[2]应该给我们4.
解决方法
ptr的类型为int(*)[3]:
int (*ptr)[3]
ptr的类型指定了如何在ptr上执行指针airthmetic.
对于以下更一般的情况:
int *p; // ... int (*ptr)[N] = p; ptr += M; // same address as p[M * N]
增加M中的指针会导致M * N * sizeof(int)的地址增量,而不仅仅是M * sizeof(int),正如您所期望的那样.
这是指针算法的工作原理,因为ptr指向的元素类型是int [N]而不是int.
声明后ptr;执行后,ptr指向a的第三个元素.增量是按int类型的三个元素而不是单个元素的步长完成的,也就是说,在你的情况下,N = 3.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。