C++中指针* 和 引用& 用法分析
指针
在这里,我们探讨的指针是指普通的指针,C++中的智能指针暂且不谈。
在编程过程中,我们经常会用到指针对变量进行操作。那么如何理解指针的作用呢?我举一个例子来方便理解:
如果将计算机中的内存看作一条街道的话,内存中的存储空间就是这条街道上的一栋栋房子,每栋房子有自己独有的地址。这里,指针的实质就是这些存储空间的一个个起始地址
前面说到了,指针的实质是地址,所以,在32位的机器上,指针的大小为4字节,64位机器上,指针大小为8字节。(一般来说,在32位的机器下,一个字节(1bit)等于8位,所以32位是4个字节。同理,64位下则为8个字节)
-
指针的基本操作
/* 在声明指针的时候对其进行赋值*/
int n = 5;
int* p = &n; //这里p的值为变量n的地址
std::cout<<"打印p:"<<p<<std::endl;
std::cout<<"打印&n:"<<&n<<std::endl;
std::cout<<"打印*p:"<<*p<<std::endl;
/*对指针p指向的整数型n进行改值操作*/
std::cout<<"------对*p进行操作------"<<std::endl;
*p = 10;
std::cout<<"打印n="<<n<<std::endl;
std::cout<<"打印*p="<<*p<<std::endl;
运行结果:
引用
C++中,一个引用就是某对象的另一可选的名字。其主要用途是为函数指定形参和返回值,特别是用于重载操作符。记法T &表示到T的引用。
引用作为别名,实现了对目标对象名字的绑定,因此必须使用目标对象的原始名字来初始化引用。例如
-
C++引用的初始化
一个普通T &的初始式必须是一个类型T的左值名。能够作用在引用上的操作只有初始化,之后的操作符将全部作用在引用所指向的对象上。
要注意的是,这些都是合法的,但是rr++并没有对引用本身做什么增量操作;相反,++是应用到了那个int对象ii上。因此,一个引用的值在初始化之后就不可能改变了,它总是引用它被初始化时所指示的那个对象。要获得一个引用rr所指示的对象的指针,可以取地址&rr。
总结引用需要注意的点:
- 引用变量就是某个变量或者对象的别名
- 引用变量不占用内存
- 引用变量必须在声明时完成赋值,完成变量与引用的绑定
指针与C++引用的不同
要 获 得一个指 针 ,需要使用 new 或者 & ; 对一个指 针 赋值会改变 指 针 的值, 让 它指 向 不同的对象; 要 修 改指 向 对象的值需要使用 * 对指 针 进行 dereference 操作(例如:*p = 10);要 获 得一个 引 用,需要使用对象的名字对 引 用变量进行初始化;引 用初始化后,无法 修 改 引 用值 让 它指 向 其他对象; 对一个 引 用 赋值将 直 接改变 引 用指 向 对象的值,相当于 自动执 行了 隐 式的 dereferencec 操作。在赋值 运 算上的 差异 ,是指 针 和 C++ 引 用的最大 差 别。C++ 引 用功能 稍弱 ,只有指 针才 能指 向 不同的对象,只有指 针才 能进行算 术运 算(例如指针对数组的操作)。