[Js-c++]c++中的指针、引用和数组名

指针和引用学了好久,还是偶尔会弄混淆,简单记录分析一下区别吧,有记起来新的区别就不断更新添加进去

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