上QQ阅读APP看书,第一时间看更新
4.2 指针操作
指针的操作有基本操作及和指针类型挂钩的操作,当指向某个类的时候,可以用箭头操作符(->)来操作对象的成员变量和成员函数,这些称为对指向对象的操作,效果等同于对象变量、变量或方法。
指针的基本操作有:*解引用、算数运算操作+、-、++、--、分配和释放new、delete,以及赋值操作符=、判断操作符==、!=。
解引用的效果相当于把指针变成对象来用,在解引用的情况下,操作的仍然是同一块内存。在第一个例子中,就是用了解引用来对指针指向的内存进行赋值。
而+、-、++、--都是对指针进行偏移,也就是修改指针指向的地址,把指针当成一个int对象的话,就是直接修改这个int对象的值。++和--对应的操作单位都是1,但是1单位的偏移量是多少?这是根据指针类型来定的!平时我们接触最多的就是char*,char*的移动单位是一个字节,初学的人很容易误以为,不管是什么类型的指针,做这些算数操作都是按照一个字节来移动的,但这种理解是错误的。1单位移动的字节数,是根据*号前面的数据类型所占字节来的计算的。
//移动单位1个字节 sizeof(char) char* p1; //移动单位4个字节 sizeof(int) int* p2; //移动单位8个字节 sizeof(double) double* p3;
指针的赋值是将指针指向的地址赋给另外一个指针,结果是这两个指针指向同一个对象,而这块内存并没有发生变化,当这块内存被释放的时候,访问就会报错。
当希望复制、保存这个对象的时候,需要另外分配一块内存,然后填充这块内存,如使用memcpy函数,又如*p1=*p2(这种操作当指向的是类对象时,会有一些问题,就是在类设计得较复杂时,需要重写类的=操作符)。
假设这个指针是new出来的,那么一定要通过delete来释放,而new [] 对应的则是delete [] 操作。