【C++】指针和引用的区别、数组和指针的区别

目录

一、指针和引用的区别

二、数组和指针的区别


一、指针和引用的区别

  • 本质

引用是别名(主要用于函数参数和返回值类型,符号X&表示X类型的引用,不是独立的);

指针是地址(存放变量地址的一个变量,是独立的,可以被改变,包括其所指向的地址的改变和其指向的地址中所存放的数据的改变。)

     

指针传递参数本质上是 值传递的方式,它所传递的是一个地址值。值传递过程中,被调函数的形式参数作为被调函数的局部变量处理,即在中开辟了内存空间以存放由主调函数放进来的 实参的值,从而成为了实参的一个副本。值传递的特点是被调函数对形式参数的任何操作都是作为局部变量进行,不会影响主调函数的实参变量的值。

而在引用传递过程中, 被调函数的形式参数虽然也作为局部变量在栈中开辟了内存空间,但是这时存放的是由主调函数放进来的实参变量的地址。被调函数对形参的任何操作都被处理成间 接寻址,即通过栈中存放的地址访问主调函数中的实参变量。正因为如此,被调函数对形参做的任何操作都影响了主调函数中的实参变量。

  • 区别
  1. 从想象看(可修改性)

引用总指向在初始化时被指定的对象,之后不能改变但其内容可变;

指针可被重新赋值,以指向另一个不同的对象。

虽然引用不可以改变指向,但是可以改变初始化对象的内容。例如就++操作而言,对引用的操作直接反应到所指向的对象,而不是改变指向;而对指针的操作,会使指针指向下一个对象,而不是改变所指对象的内容。

#include<iostream>
using namespace std;
int main(int argc,char** argv)
{
     int i=10;
     int& ref=i;
    ref++;
    cout<<"i="<<i<<endl;
    cout<<"ref="<<ref<<endl;
    int j=20;
    ref=j;
    ref++;
    cout<<"i="<<i<<endl;
    cout<<"ref="<<ref<<endl;
    cout<<"j="<<j<<endl;
    return 0;
    }

     2.非空区别(内存分配)

引用不能为空值(因为引用必须初始化,从而指向一个已经存在的对象)。程序为指针变量分配内存区域,而不为引用分配内存区域

声明指针是可以不指向任何对象,因此,使用指针之前必须做判空操作,而引用就不必。

     3.在编译时的区别

程序在编译时分别将指针和引用添加到符号表上,符号表上记录的是变量名和变量所对应的地址。指针变量在符号表上对应的地址值为指针变量的地址值,而引用在符号表上对应的地址值为引用对象的地址值。

符号表生成后不会改变,因此指针可以改变指向的对象(指针变量中的值可以改变),而引用对象不能改。所以使用指针不安全而使用引用安全

     4.合法性区别

引用:使用前不需要测试他的合法性;

指针:总是被测试,防止其为空。

     5.应用方面

引用:总是指向一个对象并且一旦指向一个对象后就不会改变指向。(使用引用)

指针:①存在不指向任何对象的可能(这种情况可以设置指针为空);

②能够在不同时刻指向不同的对象(这种情况可以改变指针的指向);

总结:

1、指针是一个变量,只不过这个变量存储的是一个地址,而引用跟原来的变量实质上是一个东西,只不过是原变量的一个别名

2、引用不可以为空,当被创建的时候,必须初始化,而指针可以是空

3、指针可以有多级,但是引用只有一级

4、指针的值在初始化后可以改变,但是引用进行初始化后就不会再改变了

5、sizeof引用得到的是指向变量的大小,而指针得到的是本身的大小

6、如果返回动态分配的对象或内存,必须使用指针,否则可能引起内存泄漏

 

二、数组和指针的区别

数组:数组是用于储存多个相同类型数据的集合。

指针:指针相当于一个变量,但是它和不同变量不一样,它存放的是其它变量在内存中的地址。

区别:

•    赋值:同类型指针变量可以相互赋值,数组不行,只能一个一个元素的赋值或拷贝

•    存储方式:数组:数组在内存中是连续存放的,开辟一块连续的内存空间。数组是根据数组的下进行访问的,多维数组在内存中是按照一维数组存储的,只是在逻辑上是多维的。指针:指针很灵活,它可以指向任意类型的数据。指针的类型说明了它所指向地址空间的内存。

•    求sizeof:数组所占存储空间的内存:sizeof(数组名),数组的大小:sizeof(数组名)/sizeof(数据类型)。在32位平台下,无论指针的类型是什么,sizeof(指针名)都是4,在64位平台下,无论指针的类型是什么,sizeof(指针名)都是8。

•    初始化方式不同。

•    传参方式:数组传参时,会退化为指针,C语言将数组的传参进行了退化。将整个数组拷贝一份传入函数时,将数组名看做常量指针,传数组首元素的地址。一级指针传参可以接受的参数类型:(1)可以是一个整形指针 (2)可以是整型变量地址 (3)可以是一维整型数组数组名;当函数参数部分是二级指针时,可以接受的参数类型:(1)二级指针变量(2)一级指针变量地址(3)一维指针数组的数组名

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值