一、指標
指標指向一塊記憶體,它的內容是所指記憶體的位址。所以說。指標就是位址。
1、指標的宣告及初始化
看下樣例
int ival = 1024;int *pi = 0; 正確。0表示空位址
int *pi0 = 5; 錯誤。5是詳細數字,不能表示位址
int *pil; 正確,宣告,並沒有初始化
*pil = 5; 正確,pil位址裡的數字是5,*pil指向5,同理*pil = ival是正確的
pil= &ival; 正確。pil就是位址,所以把5的位址賦值給pil是正確的
int *pil = &val; 正確pi = pil; 正確,就是位址之間的賦值
pil = 0; 正確,空位址
*p++ 表示先完畢取值操作。再對位址執行++操作。是位址的++。*運算子優先順序高於++。2、void *指標(*p)++ 表示*p所指向值的自加運算。是值的++。
不論什麼型別的指標都能夠直接賦值給它,無需進行強制型別轉換。
比如:
void *p1;
int *p2;
p1 = p2;
3、指向指標的指標
簡單的說就是,a指標的位址存在b指標中,則b指標就是指向指標的指標。
4、指標函式與函式指標
4.1、
指標函式是指帶指標的函式,即本質是乙個函式。
函式返回型別是某一型別的指標
型別識別符號*函式名(參數列)
int *f(x
,y);
首先它是乙個函式,僅僅只是這個函式的返回值是乙個位址值。
函式返回值必須用同型別的指標變數來接受。
float *fun();
float *p;
p = fun(a);
4.2、函式指標是指向函式的指標變數,即本質是乙個指標變數
int (*f) (int x); /*
宣告乙個函式指標*/
指向函式的指標包括了函式的位址,能夠通過它來呼叫函式。宣告格式例如以下:
型別說明符 (*函式名)(引數)
假設沒有圓括號,就變成了乙個返回整型指標的函式的原型宣告。
比如:void (*fptr)();
把函式的位址賦值給函式指標,能夠採用以下兩種形式:
fptr=&function;
fptr=function;
取位址運算子&沒必要的,由於單單乙個函式識別符號就標號表示了它的位址,假設是函式呼叫,還必須包括乙個圓括號括起來
的參數列。
總結,基本的差別是函式指標是指標變數(必需要用括號括起來),指標函式是函式。
二、引用
引用就是某一變數(目標)的乙個別名,對引用的操作與對變數直接操作全然一樣。
sizeof(引用)得到的是變數的大小。
1、宣告及初始化
引用的宣告方法:型別識別符號 &引用名=目標變數名。
【例1】:int a; int &ra=a; //定義引用ra,它是變數a的引用。即別名
說明:(1)&在此不是求位址運算,而是起標識作用。
(2)型別識別符號是指目標變數的型別
。(3)
宣告引用時,必須同一時候對其進行初始化。
(4)引用宣告完成後,相當於目標變數名有兩個名稱。即該目標原名稱和引用名,且不能再把該引用名作為其它變數名的別名。
ra=1; 等價於 a=1;
(5)宣告乙個引用,不是新定義了乙個變數,它僅僅表示該引用名是目標變數名的乙個別名。它本身不是一種資料型別,因此引用
本身不佔儲存單元。系統也不給引用分配儲存單元。
(6)不能建立陣列的引用。由於陣列是乙個由若干個元素所組成的集合。所以無法建立乙個陣列的別名。
2、引用應用
2.1、引用作為引數
引用的乙個重要作用就是作為函式的引數。曾經的c語言中函式引數傳遞是值傳遞,假設有大塊資料作為引數傳遞的時候,採用
的方案往往是指標,由於 這樣能夠避免將整塊資料所有壓棧,能夠提高程式的效率。
可是如今(c++中)又新增了一種相同有效率
的選擇(在某些特殊情況下又是必須的選擇),就是引 用。
main( )
說明:(1)以引用返回函式值,定義函式時須要在函式名前加&。
(2)用引用返回乙個函式值的最大優點是。在記憶體中不產生被返回值的副本。
3、值傳遞、指標傳遞、引用傳遞
值傳遞不能夠交換引數
指標傳遞、引用傳遞能夠交換引數。但指標傳遞是副本傳遞。浪費記憶體;引用傳遞節省記憶體。
指標與引用
摘自 高質量c 程式設計 指標與引用,在more effective c 的條款一有詳細講述,我給你轉過來 條款一 指標與引用的區別 指標與引用看上去完全不同 指標用操作符 和 引用使用操作符 但是它們似乎有相同的功能。指標與引用都是讓你間接引用其他物件。你如何決定在什麼時候使用指標,在什麼時候使用...
引用與指標
引用就是物件的另乙個名字,在實際的程式中,引用主要用作函式的形式引數。引用是一種復合型別,通過在變數名前新增 符號來定義。復合型別是指用其他型別定義的型別。在引用的情況下,每一種引用型別都 關聯到 某一其他型別。引用必須用與該引用同型別的物件初始化。當引用初始化後,只要該引用存在,它就保持繫結到初始...
指標與引用
include iostream using namespace std void testref int i 10 引用不可以為空,他是乙個物件的別名 int ref i ref cout i 00824f1e mov dword ptr i 1 把i的位址傳入eax 並把eax指標的位址傳給re...