我一直以爲,這個指針遞增/遞減是這樣的操作:Void_ptr ++不起作用,但void_ptr + =確實
new_ptr=old_ptr+sizeof(type)*count
所以爲int *那就是:
old_ptr=0 //int *ptr=0
count=1 //int count=1
new_ptr=old_ptr+sizeof(int)*count = 0+4*1 = 0x0004 //ptr+=count;
和大小void = 0,所以使用+ =增加void_ptr不應該改變它。但我可能錯了。其他的事情是++運算符,它會引發錯誤。所以如果++拋出錯誤,爲什麼+ =不拋出呢? 示例代碼:
#include <stdio.h>
void tell(const char *s,int *i,void *v){
printf("%s: \n int_ptr: %#x\n void_ptr: %#x\n",s,i,v);
}
int main(){
int *int_ptr=0;
void *void_ptr=0;
tell("Before",int_ptr,void_ptr);
int_ptr++; //int_ptr=int_ptr+sizeof(int); = 0x 0004
//void_ptr++; //error: ISO C++ forbids incrementing a pointer of type 'void*'
tell("After ++",int_ptr,void_ptr);
int_ptr+=1; //int_ptr=int_ptr+sizeof(int) = 0x0008
void_ptr+=1;//void_ptr=void_ptr+sizeof(void) WHY DOES THIS WORK AND ++ DOES NOT?! = 0x0001 ?! should be 0x0000, because sizeof void = 0
tell("After +=",int_ptr,void_ptr); //RESULT: void_ptr=0x1, so does that mean, that sizeof void is 1 and it is not 0
return 0;
}
輸出:
Before:
int_ptr: 0
void_ptr: 0
After ++:
int_ptr: 0x4
void_ptr: 0
After +=:
int_ptr: 0x8
void_ptr: 0x1
有人能解釋我嗎?
這只是一個編譯器擴展。這不合法。 – jrok
'「size = 0」' - no,[「void has no size」](http://stackoverflow.com/questions/1666224/what-is-the-size-of-void)。 – Dukeling
標準不支持直接在'void *'上執行指針數學運算。 – WhozCraig