这里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
答案 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