C++ 引用与指针 区别 做为函数参数

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个 的指针。html

// 如下三个声明等价node

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++ 数组作参数 深刻分析bash

from: C++引用&函数传递数组例子函数

2.编译意义

首先了解符号表,符号表在编译程序工做的过程当中须要不断收集、记录和使用源程序中一些语法符号的类型和特征等相关信息。这些信息通常以表格形式存储于系统中。如常数表、变量名表、数组名表、过程名表、标号表等等,统称为符号表。对于符号表组织、构造和管理方法的好坏会直接影响编译系统的运行效率。ui

做用:spa

  • 语义检查(如检查一个名字的使用和原先的说明是否一致)
  • 产生中间代码在目标代码生成阶段,当对符号名进行地址分配时,符号表是地址分配的依据。

对一个多遍扫描的编译程序,不一样遍所用的符号表也每每各有不一样。由于每遍所关心的信息各有差别。.net

例子:pascal语言编译器中的符号表

from:从编译器角度理解C++中的引用和指针3d

符号表 变量名 变量对应地址 变量值
指针 指针自身的变量名(而非指向的变量名) 指针自身的地址值 指向对象的地址值(能够修改)
引用 引用自身的不可变的名称(即对应变量的别名 对应对象的地址值(不可修改) 对应对象的值

【指针】:值传递方式。在栈中开辟了内存空间以存放由主调函数放进来的实参的值。实参指针自己的地址值不会变。

【引用】:也做为局部变量在栈中开辟了内存空间,可是这时存放的是由主调函数放进来的实参变量的地址。被调函数对形参的任何操做都被处理成间接寻址,即经过栈中存放的地址访问主调函数中的实参变量。正由于如此,被调函数对形参作的任何操做都影响了主调函数中的实参变量。

★细节区别:

  • 引用“从一而终”,指针能够“见异思迁” ,即引用只能在定义时被初始化一次,以后不可变;指针可变。
  • 引用没有const,指针有const,const的指针不可变。
  • 引用不能为空,指针能够为空。
  • “sizeof 引用”获得的是所指向的变量(对象)的大小,而“sizeof 指针”获得的是指针自己的大小。
  • 引用比指针多了类型检查,故引用是类型安全的,而指针不是。

from:传递与指针传递区别(进一步整理)

相关文章
相关标签/搜索