引用和指针

231 阅读3分钟

一般变量的引用

int a=10;
int &c=a;

c为a的一个引用,其实就是a的一个别名。在声明c为a的引用时,不需要为c开辟内存单元,地址是一样的,即&a==&c

指针变量的引用

int a=1;
int *p=&a;
int *&pa=p;

指针p指向a,pa是p的引用,(*pa++),那么a=2

变量引用

int a=1,b=2;
int &c;#此处错误,引用类型的变量在声明的时候必须初始化
int &d=a;#d作为a的引用
&d=b;#此处错误,引用只能在声明的时候被赋值,以后都不能改变

指针和引用的区别

  1. 初始化要求不同。引用创建时必须初始化,指针不用
  2. 可修改性不同。引用初始化后不可改变,但指针可以
  3. 引用不可以是null的引用,指针可以指向null
  4. 使用引用的效率比使用指针的高,因为引用不需要判空

传引用比传指针更安全

指针加减操作

对指针加一操作,得到下一个元素的地址,实际是增加指针类型所占内存的字节数,即移动sizeof(pointer)

指针常量和常量指针

常量指针:指向常量的指针。

const int *p

防止修改常量,指针所指向的地址的内容不可修改,但指针所指地址可以修改

指针常量:指针是常量的。

int* const p

指针所指地址不可修改。但是指针所指地址的内容可以变

this指针

类的非静态成员函数才有this指针,而类的static函数属于类本身,不含this指针,友元函数是非成员函数,无法通过this指针获得一份拷贝

对于类成员函数而言,并不是一个对象对应一个单独的成员函数体,而是此类的所有对象共用这个成员函数体。当程序被编译之后,此成员函数地址就确定,调用类成员函数的时候,会将当前对象的this指针传给成员函数,一个类的成员函数体只有一份,而成员函数之所以能把属于此类的各个对象的数据区分开,就在于每次执行类成员函数时,都会把当前对象的this指针传入成员函数,函数体内所有对类数据成员的访问,都会被转化为this->数据成员的方式。(这是啥意思啊?没看懂。。。等我学完c++再搞懂)

指针数组和数组指针

  • 指针数组

int * a[10]

a里面存放了10个int*类型的指针

  • 数组指针

int * b=new int[10]

其实就是指向数组的指针

野指针

野指针不是null指针,而是指向垃圾内存的指针。野指针if语句不起作用

  • 原因
    1. 指针变量没有初始化。指针在刚被创建时并不会自动成为null指针,而是随便指
    2. 指针被free或者delete后,没有置为null,让人们误以为它是合法指针

野指针很容易会导致程序运行崩溃

malloc/free和new/delete

对于非内部数据类型的对象而言,对象在消亡前需要自动执行析构函数,而malloc/free是库函数,不是运算符,不在编译器控制权限之内,无法自动执行构造函数和析构函数,而new/delete可以。

malloc/calloc/realloc

  • malloc

    (datatype*)malloc(size)

    在内存的动态存储区中分配一块大小为size字节的连续区域,返回该区域的首地址,此时内存中的值没有初始化,是个随机数

  • calloc

    (datatype*)calloc(n,size)

    在内存的动态存储区中分配n块大小为size字节的连续区域,返回首地址,此时内存中的值都被初始化为0

  • realloc

    (datatype*)realloc(*ptr,size)

    将ptr的内存增大到size,没有初始化