问题描述
我在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,因此连续整数的地址也是如此 第三种情况是整数值本身。
它在哪里变得令人困惑?快速清单:
-
当您尝试锻炼指针/索引问题时,请尽可能使用唯一值。
-
当编译器警告您时,请注意。最终,您将知道忽略“格式'%p'期望参数...”,但是建立信任度需要时间。
-
有一个方便的程序cdecl,可将C类型表达式转换成类似英语的东西。
-
在几乎所有 C实现中,
int x[2][2],y[4];
具有相同的布局;也就是说,C多维数组只是单维数组的叠加,巧妙地隐藏了该算法。因此,int (*p)[2];
之类的定义很少见,也很少有用。 如果您必须走这条路,那么最好执行以下操作:typedef int对[2]; 对torf [2] = {{0,1},{2,3}}; 对* ptr = torf;
如果没有别的,有人就有机会了解它...