【C++学习之(一)】引用和指针的区别 指向指针的指针 指向引用的指针详解

对于指针和引用他们都是c++ 中的复合数据类型

  • 引用相当于重命名 对引用和对原变量进行操作都会改变变量的值
int i=42;
int &pi=i;
i++;//改变i值
pi++;//同样改变了
  • 不允许出现引用的引用 因为应用并没用创建一个新的对象 而是为已有的一个对象创建了一个别名
  • 引用必须在声明时定义 不然报错
    int j=0; int &rj;//错误
  • 引用的类型必须和所指向的对象的类型严格匹配
int i=42;
double &ri=i//错误 指向类型不同
  • 不允许对引用赋值 int &i=10//错误

  • 指针是创建一个新的对象 因此可以对指针进行操作,允许指针赋值和拷贝

  • 允许指针生命周期内指向不同的对象

    int k=42;
    int w=9;
    int &rk=k;
    &rk=w;//错误 引用不能指向第二个对象
  • 指针无需在定义时赋初值 在块定义域内定义的没有没有初始化 将会随机分配一个地址,分配一个不确定的值
int *p;
cout<<P<<endl;//位置随机 每次都可能不一样
  • 指针指向和定义要严格匹配
int i=42;
double *pd=&i//wrong! 指向类型不同
  • 引用可以指向指针所指定的值
int &i=*p;//ok!

补充:空指针 null point不指向任何内容

空指针的定义方法

int *pv=nullptr;//c++11推荐
int *pv1=0;
int *pv2=NULL;//C遗留

补充:void* 型指针

  1. 可以存放任何地址的指针
  2. 用处

1.拿它和别的指针比较
2.作为函数的输入和输出
3.赋值给另外一个void*型指针

  1. 不能操作void*型指针所指向的内容,因为我们并不知道所指对象的类型,就不能确定有哪些操作
int i=9;
void *p=&i;
*p++;//错误 不能访问

一种容易误导的写法

int* p1,p2;
//p1是指针 但是p2是int变量

指向指针的指针

int i=42;
int* p=&i;
int **pp=&p;
cout<<pp<<endl;//0x7ffee4e15a90
cout<<*pp<<endl;//0x7ffee4e15a98
cout<<**pp<<endl;//42
cout<<p<<endl;//0x7ffee4e15a98
cout<<*p<<endl;//42

指向引用的指针

引用本身不是一个对象 因此不能定义指向引用的指针

指向指针的引用

指针是对象 所以存在对指针的引用

int i=10;
int *p;
int *&r=p;//定义一个指向P的引用
r=&i;//P指向i
*r=0;//赋值

Tip

对于比较复杂的引用声明语句可以从右往左读


版权声明:本文为qq_37581730原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。