【问题标题】:Determining the difference of row elements in 3d array确定 3d 数组中行元素的差异
【发布时间】:2014-08-25 13:42:53
【问题描述】:

我需要知道是否有 3d 数组说:

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

表达式 a[1]-a[0] 是如何计算的?

【问题讨论】:

  • a[1] - a[0] 尝试减去两个int**。我相信这是一个编译器错误,它绝对不是你想要的。
  • 不经过3维就直接做指针算术
  • 您必须向a[0] 添加多少才能到达a[1]
  • 你想找出row1和row2所有元素的区别吗?

标签: c arrays multidimensional-array


【解决方案1】:

表达式 a[1]-a[0] 计算什么?

如果用作算术运算符- 的运算符,它会计算a[1]a[0] 衰减的指针之间的差异。

【讨论】:

  • 确定吗? int a[2][3][2]={{{1,2},{9,8},{3,7}},{{2,2},{1,4},{5,4}}}; printf("%ld\n", a[1]-a[0]); 打印 3
  • 你的描述是&a[1]-&a[0]
  • 哎哟..是的。从我的答案中删除了无意义的添加。 @mch
  • 清理完毕。 @BLUEPIXY
【解决方案2】:
#include <stdio.h>

int main(void){
    int a[2][3][2]={{{1,2},{9,8},{3,7}},{{2,2},{1,4},{5,4}}};
    printf("%d\n", (int)(a[1]-a[0]));//3
    int (*b1)[2] = a[1];//b1 point to {1,2}
    int (*b0)[2] = a[0];//b0 point to {2,2}
    printf("%d\n", (int)(b1-b0));//3
    printf("%d\n", (int)(&a[1]-&a[0]));//1

    return 0;
}
/*
int a[2][3][2]
a <-> int (*)[3][2]
a[n] <-> int [3][2] <-> int (*)[2]
&a[n] <-> int (*)[3][2]
*/

【讨论】:

    【解决方案3】:

    始终将多维数组视为网格/表格。
    这是同一个数组被分成多个部分:

    a[2] = 包含 2 个二维数组的容器
    [3] = 包含 3 个数组的容器
    [2] = 实际数据值

    您要访问的数据全部取决于您在调用数组时放置了多少个括号,例如:

    a[1] = {{2, 2},{1, 4},{5, 4}}
    a[1][1] = {1, 4}
    a[1][1][1] = 4

    表达式 a[1] - a[0] 无法完成,因为您正在用另一个数组减去一个数组,这意味着您使用的是指向数据的对象,而不是实际数据。但是,它从字面上评估为:

    a[1] = {{2, 2},{1, 4},{5, 4}} 和
    a[0] = {{1, 2},{9, 8},{3, 7}} 所以,
    {{2, 2},{1, 4},{5, 4}} - {{1, 2},{9, 8},{3, 7}}

    【讨论】:

    • 不,它减去相对于对象大小的地址,所以在这个例子中结果是3
    • 数组a[1]a[0]衰减到int (*)[2],可以相减。
    • @nilpointerinception 是的,适合你。它告诉你你的最后一段不正确。
    • 添加和减去指向同一个对象(此处为数组)的指针是完全有效的。阅读有关指针算法的结果。
    • @alk thnk 你...想知道你 3.知道了..没有编译错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-07
    • 1970-01-01
    • 2018-02-14
    • 2016-11-17
    • 2019-12-05
    • 2019-05-12
    • 2016-06-21
    相关资源
    最近更新 更多