一般变量的引用
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;#此处错误,引用只能在声明的时候被赋值,以后都不能改变
指针和引用的区别
- 初始化要求不同。引用创建时必须初始化,指针不用
- 可修改性不同。引用初始化后不可改变,但指针可以
- 引用不可以是null的引用,指针可以指向null
- 使用引用的效率比使用指针的高,因为引用不需要判空
传引用比传指针更安全
指针加减操作
对指针加一操作,得到下一个元素的地址,实际是增加指针类型所占内存的字节数,即移动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语句不起作用
- 原因
- 指针变量没有初始化。指针在刚被创建时并不会自动成为null指针,而是随便指
- 指针被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,没有初始化