大家都知道对于一般的指针,比如int*等,其加减运算是以元素的大小为单位的。
unsigned int *s = (unsigned int*)0x1234;
cout << s+1 << endl;
cout << s-1 << endl;
其结果分别是:0x1238, 0x1230
分别加减了一个unsigned int的大小,也就是4个字节。
但是当指针类型为void*时,其加减运算与普通整数没有区别:
void *s = (void*)0x1234;
cout << s+1 << endl;
cout << s-1 << endl;
结果为:0x1235, 0x1233 ,像整数一样,只加减了一。
出现这种问题,应该是因为void* 类型的指针是一种泛型的指针(可指向任意类型的元素),编译器无法推导出其指向的元素类型,自然也就不能作与类型有关的运算(加或减去一个类型的大小来指向下一个元素)。
而对于int*类型的指针,编译器知道它是指向int类型数据的,其加减运算就可以int类型数据的大小为单位。
测试程序:
测试结果:
测试环境为:
g++ (Ubuntu 7.4.0-1ubuntu1~18.04.1) 7.4.0