这些类型如何(int(* ptr)[3])= a; (其中a = = int a [] [3] = {1,2,3,4,5,6})语句在C中工作?增量“ptr”给出了意想不到的结果

这些类型如何(int(* ptr)[3])= a; (其中a = = int a [] [3] = {1,2,3,4,5,6})语句在C中工作?增量“ptr”给出了意想不到的结果,第1张

概述对于以下代码: #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)[1], (*ptr)[2]); 对于以下代码:

#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.

总结

以上是内存溢出为你收集整理的这些类型如何(int(* ptr)[3])= a; (其中a = = int a [] [3] = {1,2,3,4,5,6})语句在C中工作?增量“ptr”给出了意想不到的结果全部内容,希望文章能够帮你解决这些类型如何(int(* ptr)[3])= a; (其中a = = int a [] [3] = {1,2,3,4,5,6})语句在C中工作?增量“ptr”给出了意想不到的结果所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1218585.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存