指针与引用的概念和不同
指针的概念:指针就是一个地址变量,有自己的一块空间
指针大小是4个字节
1. int x = 0;
2. int *P = &x;
可以看出指针P直接指向变量x的地址,&p是指针的对应地址
引用的概念:变量的别名,不占用内存空间
1. int x = 0;
2. int &y = x;
y的地址与x的地址一样,y没有属于自己的地址因此它不占有内存空间
函数的传参可以分为个值传递(不改变内容)和地址传递(改变内容),c++11中也可以用引用作为形参
1. int A(int &a){ a++; }
2.
3. int main(){
4. int x = 1;
5. int*p = &x;
6. int& y = x;
7. A(a);
8. A(y);
9. A(*p);
10.}
其实指针和引用只是表面上看起来不一样是为了方便使用,在低层实现时,两者是一样的.(把1存储在变量a的地址中,把变量a的地址给到一个地址寄存器中,把地址寄存器中的地址存到指针p的地址中,在汇编的实现中引用和指针是一样的)主流的编译器会把引用解释成const指针
C/C++中指针和引用的区别:
- 指针有自己的内存空间,引用只是变量的别名(尽管它们在底层汇编过程的实现一样,在优化编译器中会把对引用进行的计算直接用变量的值进行计算)
- 使用sizeof看一个指针的大小就是4,而引用的大小取决于引用对象的类型
- 指针可以初始化为NULL,而引用必须被初始化为一个已有对象的引用;
- 作为参数传递时,指针需要被解引用才可以对对象进行操作,而直接对引用的修改会改变引用所指向的对象;(即传参数要传p,如果对p进行加一操作会改变p*所指向的地址)
- 可以有const指针,但是没有const引用(const可以指代常变量,常变量不可改变;也可以指代常指针,指针所指向的地址不可以改变)const的使用是先左后右
int * const j;(常指针,值可变,但是指针指向的地址不可变) const int * j;(值不可变但是指针指向的地址可变) const int & x;(不可以通过引用x去改变对象的值)
- 指针可以在使用中指向其它对象,但是引用只能是初始化的对象,不能改变
- 指针可以有多级指针,而引用止于一级
- 指针和引用使用++运算符的意义不一样
- 如果返回动态内存分配的对象或内存.必须用指针,引用可能引起内存泄露