指针与数组和引用的区别和联系

概念:

  • 指针:指针是内存中的地址
    例:
    指针就是你家在一栋楼里的门牌号
  • 数组:相同数据类型按一定的顺序排列的集合
    例:
    就是一个班级里的学生这个集合(共同类型就是学生)
  • 引用:一个变量的别名

指针的作用:

  • 指针作为参数:
    例:

void swap(int*p,int*q)
{
int tmp=*p;
*p=*q;
*q=tmp;
}
void main()
{
int a=0;
int b=0;
swap(&a,&b);
}

在这个例子中想要交换a和b的值,用值传递是不能满足的,因为我们知道形参是实参的一份拷贝,在把a,b作为值传给swap函数,swap函数会拷贝一份和值与a,b相同的值进行交换,在swap完成了自己的功能时函数栈帧消失,然而这与主函数的a,b并没有关系所以要采用地址作为参数传递,指针就是地址所以指针作为函数参数这时必要的

  • 指针作为返回值
    使用指针作为函数返回值是要十分谨慎的,我们都知道函数在调用完成时就伴随着栈帧的销毁,此时如果你的指针是在栈上,在函数结束是指针就销毁了,这时调用函数在使用这个指针时就会产生乱码或者正确,此时给调bug带来了极大的问题;如果你的指针是在堆上就一定要手动释放,(栈区的内存是编译器自动释放的,堆区的内存则需要程序员自己手动释放或者程序结束系统自动释放)。

指针的BUG

解引用空指针

指针除了以上提到的不便之外有一个最不好的一点就是解引用空指针:
解引用空指针会出现一下现象:
1.程序异常退出
2.程序崩溃
3.底层现象:就引用空指针时,当MMU将虚拟地址转化为物理地址时就会发现进程访问了非法地址,此时就会MMU就会产生异常,这时内核还将这个异常解释为11号信号发送给当前正在执行的进程.

内存泄漏

除了上述说的到的堆上指针忘记释放会产生内存储泄露外还有就是重复new也会产生内存泄漏

常见的指针

  • 野指针
    未初始化的指针
  • this指针
    this是类的指针,可以实现快速访问类的数据成员和成员函数,const和static成员都没有this指针
  • 悬垂指针(迷途指针):指向曾经存在的对象,但该对象已经不再存在了
  • 指针常量:(指针的常量):int *const p;指针不可以改变,指针所指向的值可以变
    例:
    你家的门牌号就是指针的常量,门牌号是不能改变的但是你们是房子里的人是可以改变的
  • 常量指针:(常量的指针):const int * p;指针可以改变,指针所指向的值不可以变
    例:
    常量指针就是你的电话号码,你的电话号码是可以改变的但是不论你换了几个电话号你依旧是你,通过你的电话找到的就是你。
  • 指针数组:数组中存放的是指针(一个指针的集合)
    例:
    宿管阿姨登记宿舍号的那张登记表(登记表示指针数组,宿舍号就是指针)
  • 数组指针:指向一个数组的指针
    例:
    arr[4]={1,2,3,4};
    arr就是数组指针;
  • 二级指针:指向指针的指针
    例:
    arr[2][3]={{1,2,3},{4,5,6}};

指针与数组和引用的区别和联系_第1张图片

指针的运算

指针的加减就是指两块内存之间的距离

指针与数组的区别

int* p=& a;
int arr[3]={};
1.指针的大小时 固定的(32位)4字节,数组的大小为每个元素的大小*素组元素个数
2.数组的数组名代表的就是指向数组第一个元素的指针。(但是sizeof(数组名)整个数组的大小)
3.指针是可以修改的左值,数组名不可以
4.p代表的是a的地址,要得到a的值就要对p解引用(即*p),要得到数组arr的第x个元素直接写为arr[x];要得到地址就用&arr[x]

指针以引用的区别

1.引用必须被初始化,指针不用
2.不存在指向空值的引用,但是存在指向空值的指针
3.引用不能被修改,指针可以
例:

指针与数组和引用的区别和联系_第2张图片

你可能感兴趣的:(c++)