1.使用区别
- 整型
| 区别 | 声明 | 定义 | 调用 |
|---|---|---|---|
| 指针 | void swap(int *,int *); | void swap(int *a,int *b){ } |
swap(p1,p2); |
| 引用 | void swap(int &,int &); | void swap(int &a,int &b){ } |
swap(i,j); |
- 数组
【指针】: 在 C++中,数组永远不会按值传递,它是传递第一个元素,准确地说是第 0个 的指针。
// 以下三个声明等价
void putValues( int* );
void putValues( int[] );
void putValues( int[ 10 ] );
当进行数组参数传递,需要知道长度时,一种是通过额外表示长度的参数;另一种是通过引用,如下:
【引用】:
//声明
void sort( int (&arr)[10] );
//定义
void sort( int (&arr)[10] )
{
}
//调用
int main()
{
int a[10] = {1,8,5,6,3};
sort(a);
return 0;
}
from: C++引用&函数传递数组例子
2.编译意义
首先了解符号表,符号表在编译程序工作的过程中需要不断收集、记录和使用源程序中一些语法符号的类型和特征等相关信息。这些信息一般以表格形式存储于系统中。如常数表、变量名表、数组名表、过程名表、标号表等等,统称为符号表。对于符号表组织、构造和管理方法的好坏会直接影响编译系统的运行效率。
作用:
- 语义检查(如检查一个名字的使用和原先的说明是否一致)
- 产生中间代码在目标代码生成阶段,当对符号名进行地址分配时,符号表是地址分配的依据。
对一个多遍扫描的编译程序,不同遍所用的符号表也往往各有不同。因为每遍所关心的信息各有差异。
from:从编译器角度理解C++中的引用和指针
| 符号表 | 变量名 | 变量对应地址 | 变量值 |
|---|---|---|---|
| 指针 | 指针自身的变量名(而非指向的变量名) | 指针自身的地址值 | 指向对象的地址值(可以修改) |
| 引用 | 引用自身的不可变的名称(即对应变量的别名 | 对应对象的地址值(不可修改) | 对应对象的值 |
【指针】:值传递方式。在栈中开辟了内存空间以存放由主调函数放进来的实参的值。实参指针本身的地址值不会变。
【引用】:也作为局部变量在栈中开辟了内存空间,但是这时存放的是由主调函数放进来的实参变量的地址。被调函数对形参的任何操作都被处理成间接寻址,即通过栈中存放的地址访问主调函数中的实参变量。正因为如此,被调函数对形参做的任何操作都影响了主调函数中的实参变量。
★细节区别:
- 引用“从一而终”,指针可以“见异思迁” ,即引用只能在定义时被初始化一次,之后不可变;指针可变。
- 引用没有const,指针有const,const的指针不可变。
- 引用不能为空,指针可以为空。
- “sizeof 引用”得到的是所指向的变量(对象)的大小,而“sizeof 指针”得到的是指针本身的大小。
- 引用比指针多了类型检查,故引用是类型安全的,而指针不是。
from:传递与指针传递区别(进一步整理)