指针和引用学了好久,还是偶尔会弄混淆,简单记录分析一下区别吧,有记起来新的区别就不断更新添加进去
1、指针可以多次重新分配,引用在无法重新分配,而且必须在声明的时候被初始化
2、指针可以指向空(即被定义为nullptr),但是引用必须指向一个东西
3、不存在“引用计算”这种东西(但是你用 &d+5 这种的确不会报错,也能算出来东西)
4、一个指针在堆栈上有自己的内存地址和大小(x86上有4个字节),而引用共享相同的内存地址(与原始变量),但是也占用堆栈上的一些空间。由于引用具有与原始变量本身相同的地址,因此可以安全地将引用视为同一变量的另一个名称。注意:指针指向的内容可以位于堆栈或堆上。同上参考。我在这个陈述中的主张并不是指针必须指向堆栈。指针只是一个保存内存地址的变量。这个变量在堆栈中。由于引用在堆栈上有自己的空间,并且地址与其引用的变量相同。更多关于堆栈vs堆。这意味着有一个编译器不会告诉你的引用的真实地址。
我们默认的一种规则:
· 在函数参数和返回类型中使用引用来提供有用和自我记录的接口。
· 使用指针来实现算法和数据结构。
有关于数组名和指针:
表达式中的数组名被编译器当作一个指向该数组第一个元素的指针。
下标总是与指针的偏移量相同.
在函数参数的声明中,数组名被编译器当作指向该数组的第一个元素的指针(换言之,在函数调用的时候数组名会退化成指针,但是 sizeof 函数取数组大小的时候不是这样)。
有关数组名,指针,以及引用的加法:
数组名和指针都可以做算术运算(但实际上乘除法应该是没有意义的),但是数组名做完运算不能赋值回去,指针则可以(换言之,对于数组不能使用名自增自减运算符)
假设有一个数组 a[10]
1 /* 2 a: 0012FF20 3 &a: 0012FF20 4 a+1: 0012FF24 5 &a+1: 0012FF48 6 */
a和&a指向的是同一块地址,但他们+1后的效果不同,a+1是一个元素的内存大小(增加4),而&a+1增加的是整个数组的内存大小(增加40)
&a取都得是整个数组的地址!既数组名取地址等价于对数组取地址。(而不是想象中的,数组名是指针,给指针取地址就是指针的指针)
目前还没看到要用到&a这种写法的地方
原文地址:https://www.cnblogs.com/jiasq/p/9200701.html