c - *(arr+i)[1] 和 **(arr+i) 表示的元素是如何确定的?

标签 c arrays pointers

我不明白如何确定以下元素:

  1. *(arr+1)[1] - 7 被打印出来。

  2. **(arr+1) - 打印 4。

#include <stdio.h>
int main()
{
    int arr[3][3]={1,2,3,4,5,6,7,8,9};
    printf("%d %d",*(arr+1)[1],**(arr+1));
    return 0;
}

最佳答案

根据定义,a[b] 等同于*(a + b)

[](后缀)的优先级高于*(前缀),因此*a[b] 解析为* (a[b]).

  1. *(arr+1)[1] 解析为 *((arr+1)[1])

    *((arr+1)[1]) 等同于 *(*(arr+1+1))

    *(*(arr+1+1)) 简化为 **(arr+2)

    **(arr+2) 等价于*(arr[2])

    *(arr[2]) 等价于*(arr[2]+0)

    *(arr[2]+0) 等同于 arr[2][0]

  2. **(arr+1) 等价于*(arr[1])

    *(arr[1]) 等价于*(arr[1]+0)

    *(arr[1]+0) 等同于arr[1][0]

至于实际数据:

int arr[3][3]={1,2,3,4,5,6,7,8,9};

有点难读。更好:

int arr[3][3]={
    {1, 2, 3},
    {4, 5, 6},
    {7, 8, 9}
};

在第一种情况下,arr[2][0] 给出第三个子数组 (7,8,9) 的第一个元素 (7) ) 而在第二种情况下,arr[1][0] 为您提供第二个子数组 (4, 5,6).

关于c - *(arr+i)[1] 和 **(arr+i) 表示的元素是如何确定的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55556584/

相关文章:

c++ - 避免 pthread 中产生多个线程

c - 有没有成熟的二元决策图工具可用?

javascript - Google 电子表格脚本 - 仅授予对一张工作表的访问权限

c - 如何在 C 中声明指向结构的指针?

c - 如何将字符串转换为 int 或 float 类型?

makefile 可以用来读取输入文件吗?

c - B 树删除节点时的段错误

c++ - 面对使用指针的困难

c# - 从字节数组运行程序

c++ - 我被这段使用指针访问二维数组中的值的代码所困扰