使用C中的指针算法访问2D数组元素

Man*_*kam 1 c arrays pointers multidimensional-array

我有这个代码,我一直试图找出对指针,数组组合的疑问.

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;
}
Run Code Online (Sandbox Code Playgroud)

怀疑是: 即使s [2]和(s + 2)指的是同一个地址,为什么*(s [2])打印该值(即1434)但*(s + 2)打印相同的地址解决了(s + 2)打印的内容.不是*(s + 2)在第3个1D阵列的地址处的平均值(即s [2] [0])?

Som*_*ude 6

让我们来看看你的数组在内存中的外观:

+---------+---------+---------+---------+---------+---------+---------+---------+
| 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],你有五个可能指向该位置的指针:

  1. &s[0][0].这是类型int *.
  2. &s[0].这是类型int (*)[2].
  3. s[0].这将衰减为指向第一个元素的指针s[0],并且等于1.
  4. s.这将衰减为指向第一个元素的指针s,并且等于2.
  5. &s.指向数组的指针int (*)[4][2].

正如你所看到的,你可以有很多不同的指针指向完全​​相同的位置,但它们可能意味着不同的东西,这在语义上有很大的不同.