C混淆指针算法

时间:2018-11-23 07:34:52

标签: c pointers

我对C指针运算感到困惑。 我了解到,当我添加或减去指针地址时,它会以其数据类型的倍数进行加或减。 例如:

int *p =90;
p+=1;
printf("%d",p); 

从90 + 1 * 4 = 94开始返回94。

但是,以下代码返回奇怪的结果。

void set_next_block_size(long long int * current, long long int size){
    *(current+1+size/8)=size;
}

我猜()中的值将是current + 8 + size,因为long long int类型占用8个字节,但实际上是将其计算为current + 1 + size / 8 ..

多长?

1 个答案:

答案 0 :(得分:3)

void set_next_block_size(long long int * current, long long int size){
    *(current+1+size/8)=size;
}
  

我猜()中的值将是current + 8 + size,因为long long int类型占用8个字节,但实际上是将其计算为current + 1 + size / 8 ..

您猜错了。从第一个片段中,您似乎了解了指针算术的规则:+1的实际含义是“将指针地址移动1个所指向类型的元素,即4个字节”。

现在,您要移至下一个元素,并要使用大小而不是数字。为什么现在应该有所不同?

它仍然与以前一样工作。

如果添加+8,则将添加8*sizeof(long long int)个字节。这会将地址更改64+size个字节,这似乎不是您想要的。 相反,您只想添加1个元素+ size。这就是为什么它是+1而不是+8

的原因