【发布时间】:2012-04-07 20:45:51
【问题描述】:
我正在翻阅我的教科书,我对其中的一些代码感到有些困惑。一方面,他们通过以下方式执行指针运算:
void* bp;
...
bp = (void*)((char*)(bp)+16);
...
但稍后,他们会执行以下操作:
void* bp;
...
bp = bp+16;
...
我觉得他们应该是两个不同的东西,但他们把它当作同一个东西对待。 我有这种感觉是因为,例如,如果您要进行数组访问(例如,对于整数数组),您将执行以下操作
int* a = malloc(n*sizeof(int));
...
q = *(a+1);
...
在这种情况下,我不是访问整数数组中接下来的 4 个字节而不是下一个字节吗? 同样,我觉得如果我有 void* a,那么 *(a+1) 应该是接下来的 4 个字节...... 或者事实并非如此? 谢谢。
【问题讨论】:
-
第二个例子不应该编译。
-
@OliCharlesworth:如果您在一致模式下编译,它将不会编译(或至少会触发警告)。 gcc 默认情况下不符合,并实现
void*算术作为扩展。
标签: c pointers pointer-arithmetic