多维数组的指针算术如何完成?

时间:2018-10-25 08:57:14

标签: c arrays pointers multidimensional-array

这里e应该是a [1]处的地址,a是a [0]处的地址。然后减去它便是1,但结果是两者之间的总字节数。此处未应用指针算法。(忽略警告)。

int a[10][20][30] = {0};
int *d = a;
int *e = a+1;
printf("%ld", e-d);//why is this not 1

1 个答案:

答案 0 :(得分:1)

这是因为您使用的指针类型不正确。实际上,编译器甚至告诉您:

module VouchersHelper
    def orders_chart_data
        orders_by_day = Voucher.total_grouped_by_day(1.month.ago)
        (1.month.ago.to_date..Date.today).map do |date|
            {
                created_at: date,
                price: orders_by_day[date].first.try(:total_price) || 0
            }
        end
    end
end

如果我们通过强制转换来克服错误,编译器将使用以下错误类型进行计算:

prog.c: In function ‘main’:
prog.c:5:11: error: initialization from incompatible pointer type [-Werror=incompatible-pointer-types]
  int *d = a;

请记住,当减去指针时,编译器使用的内部公式为int a[10][20][30] = {0}; int *d = (int*)a; int *e = (int*)(a+1); printf("%ld", (long)(e-d)); 。如果(address2 - address1) / sizeof(type)sizeof(int) == 4位于地址1000,则为a

使用正确的类型((3400 - 1000) / 4 == 600)给我们答案sizeof(int[20][30]) == 2400

(3400 - 1000) / 2400 == 1