我有这段代码,其中我一直试图找出对指针、数组组合的疑问。
int main()
{
int s[4][2] = {
{1234,56},
{1212,13},
{1434,80},
{1312,78}
};
printf("%d\n",s[2]);
printf("%d\n",*s[2]);
printf("%d\n",s+2);
printf("%d\n",*(s+2));
return 0;
}
疑问是:
即使 s[2] 和 (s+2) 指的是相同的地址,为什么 *(s[2]) 打印值(即 1434 )而 *(s+2) 打印相同的地址 what (s+ 2) 已打印。 *(s+2) 不是第 3 个一维数组(即 s[2][0])地址处的平均值吗?
让我们看看你的数组在内存中的样子:
+---------+---------+---------+---------+---------+---------+---------+---------+
| s[0][0] | s[0][1] | s[1][0] | s[1][1] | s[2][0] | s[2][1] | s[3][0] | s[3][1] |
+---------+---------+---------+---------+---------+---------+---------+---------+
^ ^ ^ ^
| | | |
&s[0][0] &s[0][1] &s[1][1] |
| | |
&s[0] &s[1] |
| | |
s[0] s[1] |
| | |
s s+1 |
| |
&s &s+1
现在让我们使用s[0][0]
,您有五个 可能指向该位置的指针:
&s[0][0]
。这是 int *
类型。
&s[0]
。这是 int (*)[2]
类型。
s[0]
。这将衰减为指向 s[0]
中第一个元素的指针,并且等于 1。
s
。这将衰减为指向 s
中第一个元素的指针,并且等于 2。
&s
。指向数组的指针,类型为 int (*)[4][2]
。
如您所见,您可以有许多不同的指针指向完全相同的位置,但它们可能意味着不同的事物,这在语义上产生了很大的差异。