微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

指针无法读取数组中的正确元素

如何解决指针无法读取数组中的正确元素

我在C语言中有一个指针,我不知道它是如何工作的。 下面是代码

// ptr points to an array of 2 ints
int (*ptr)[2];
int torf[2][2] = {12,14,16};
ptr = torf;

int (*ptr_2)[2];
int torf_2[2][2] = { {12},{14,16}};
ptr_2 = torf_2;
  
printf("%d %d\n",**ptr,**(ptr + 2));
printf("%d %d\n",**ptr_2,**(ptr_2 + 2));

我想要的答案应该是:

12 16
12 14

但实际上我已经在PC上:

12 6422000
12 12

有什么想法吗?

解决方法

尝试一下:

// ptr points to an array of 2 ints
int(*ptr)[2];
int torf[2][2] = { 12,14,16 };
ptr = torf;

int(*ptr_2)[2];
int torf_2[2][2] = { {12},{14,16} };
ptr_2 = torf_2;

printf("%d %d\n",**ptr,**(ptr + 1));
printf("%d %d\n",**ptr_2,**(ptr_2+1));

使用指针时,就像数组的索引一样,它从0开始;

干得好

,

如果将这些行添加到程序的末尾:

printf("%p: %p %p\n",ptr,ptr+1,ptr+2);
printf("%p: %p %p\n",*ptr,*ptr+1,*ptr+2);
printf("%p: %p %p\n",**ptr+1,**ptr+2);

您会注意到,在第一种情况下,数字会增加8,这可能是指针的大小或两个整数。第二个相同,但是第三个增加一个int的大小;这样很好。

因此,要消除2个整数或1个地址的歧义,让我们做s / 2/3 / g。 现在,我们看到第一种情况,增量现在是12(= 3 * 4)。 您的第二种情况(* ptr + i)递增4,因此连续整数的地址也是如此 第三种情况是整数值本身。

它在哪里变得令人困惑?快速清单:

  1. 当您尝试锻炼指针/索引问题时,请尽可能使用唯一值。

  2. 当编译器警告您时,请注意。最终,您将知道忽略“格式'%p'期望参数...”,但是建立信任度需要时间。

  3. 有一个方便的程序cdecl,可将C类型表达式转换成类似英语的东西。

  4. 在几乎所有 C实现中,int x[2][2],y[4];具有相同的布局;也就是说,C多维数组只是单维数组的叠加,巧妙地隐藏了该算法。因此,int (*p)[2];之类的定义很少见,也很少有用。 如果您必须走这条路,那么最好执行以下操作:

    typedef int对[2]; 对torf [2] = {{0,1},{2,3}}; 对* ptr = torf;

如果没有别的,有人就有机会了解它...

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。