我对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 ..
多长?
答案 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