c - 在 C 中使用指针算法访问二维数组元素

标签 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;
}

疑问是: 即使 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],您有五个 可能指向该位置的指针:

  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]

如您所见,您可以有许多不同的指针指向完全​​相同的位置,但它们可能意味着不同的事物,这在语义上产生了很大的差异。

关于c - 在 C 中使用指针算法访问二维数组元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44284362/

相关文章:

c - 为什么函数中有 'static' 定义?

c - 在C中实例化临时静态列表头指针

C++:正确覆盖模板类中的虚函数

C编程: Segmentation fault (core dumped)

c - 字符串常量的宽度前缀

c - 我可以打印出我读到的字符串值,但在转换为使用其 ASCII 等效项时遇到问题

javascript - 在输出之前随机化 JSON 内容的内容

c# - 在 C# 中是否有对字节数组进行循环位移的函数?

python - 破解编码面试,第 6 版,1.7

c++ - 在 C++ 中搜索和替换 C 风格的字符串