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:傳遞與指針傳遞區別(進一步整理)

相關文章
相關標籤/搜索