指针的运算可以有很多,不是书本上或老师讲的只有加减运算。指针其时还有别的运算。大家可以大胆的去想,不要被书本上的知识束缚了自己的思考。
为什么书本上一般都只讲指针的加减运算,因为只有加减运算有实际意义
指针加,就是指针后移,
指针减,就是指针前移
加/减1代表移动一个类型宽度,这也说明了为什么void*类型指针不能做加减运算,因为void*指针编译器无法知道一次要移动多少个字节。
下面大家想个问题,指针的加减运算是将它当作变量,哪指针可以当作变量,C++中关于变量的运算符不就都可以用于指针运算了吗?C++运算符优先级
这个想法不错,写段代码来验证。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
//梁笔记 //zouzhongliang.com #include <cstring> #include <iostream> using namespace std; /* int operator%(int* add, int n) { int a = (int)add; a = a%n; return a; } */ int main() { int* a = new int[10]; //sizeof操作符 cout<<"sizeof操作符:"<<sizeof(*a)<<endl; //a地址 cout<<"a地址:"<<a<<endl; //类型转换 int aval = int(a); cout<<"类型转换:"<<aval<<endl; //++ cout<<"++:"<<++a<<endl; //-- cout<<"--:"<<--a<<endl; //| // a |= a; // cout<<"|:"<<a<<endl; //* // a = a*2; // cout<<"*:"<<a<<endl; // / // a = a/2; // cout<<"/:"<<a<<endl; //% /* int addy = a%2; cout<<"%:"<<addy<<endl; */ return 0; } |
指针运算结果是,运算结果没有意义的C++都没有定义,所以都编译错误 ,| 、*、/、%这类都不能用作指针运算。还有操作符重载有指针被重载,编译也不会让通过。报错如下:
1 2 3 |
in evaluation of `operator|=(int*, int*)' invalid operands of types `int*' and `int' to binary `operator*' int operator%(int*, int)' must have an argument of class or enumerated type |
其它指针运算可正常编译输出如下:
1 2 3 4 5 |
sizeof操作符:4 a地址:0x6c2de0 类型转换:7089632 ++:0x6c2de4 --:0x6c2de0 |
以上没有将全部操作符作一一测试,但可以肯定的是,只有对指针运算有意义的,C++才会定义,无意义的运算不会通过编译。这点也说明了指针与变量的一个区别,所以不能把指针完全当作变量看待。也不要试图对指针进行操作符重载。
所以大家在学习编程时,要多写代码,多测试自己的想法,这样才会成长。