詳解C++中的指針、數組指針與函數指針。本站提示廣大學習愛好者:(詳解C++中的指針、數組指針與函數指針)文章只能為提供參考,不一定能成為您想要的結果。以下是詳解C++中的指針、數組指針與函數指針正文
C++中一個主要的特征就是指針,指針不只具有取得地址的才能,還具有操作地址的才能。指針可以用於數組、或作為函數的參數,用來拜訪內存和對內存的操作,指針的應用使得C++很高效,然則指針也異常風險,應用欠妥會帶來比擬嚴重的成績。
1、指針
法式中一切的變量和常量都存在一個內存地址中,固然,函數也有對應的內存地址,內存地址的分歧會招致法式履行時有所分歧。
指針就是用來掌握和存儲內存地址的變量,它指向單個對象的地址,除void以外,指針的數據類型與所指向地址的變量數據類型堅持分歧。
2、若何界說指針、數組指針、函數指針
罕見的指針界說有3種:變量指針、數組指針和函數指針的界說。
(1)、變量指針的界說
int* p=0; //界說指針p,並初始化指針為0,即指向的地址為0000 0000
或
int a=0; //界說初始化常量a
int* p; //界說指針p
p=&a; //指針p指向a的地址,即指針獲得地址
(2)、數組指針的界說
int a[]={0,1,2,3,4,5,6,7,8,9}; //界說數組
int* p=a; //界說並賦值數組指針,即取得數組的首地址
(3)、函數指針的界說
int f(); //界說函數
int (*p)(); //界說函數指針
p=f; //賦值函數指針,即取得函數代碼的首地址
差別變量指針、數組指針和函數指針的界說,示例代碼以下。
#include<iostream> using namespace std; int f() //界說一個函數 { cout<<"測試函數指針的應用"<<endl<<endl; return 0; } void main() { cout<<"==========變量指針的應用=========="<<endl; int a=5; int* p=0; //初始化指針為0 int* q; //界說指針 q=&a; //賦值指針 cout<<"a = "<<a<<endl; //變量a的值 cout<<"a = "<<*q<<endl; //變量a的值 cout<<"p = "<<p<<endl; //指針p的地址為0000 0000 cout<<"&a = "<<&a<<endl; //獲得a的地址 cout<<"&a = "<<q<<endl; //獲得a的地址 cout<<"==========數組指針的應用=========="<<endl; int b[]={0,1,2,3,4,5,6,7,8,9}; int* pb=b; //直接指向第一個元素的地址 cout<<pb<<endl //第1個元素的地址,即數組的首地址 <<b<<endl //第1個元素的地址,即數組的首地址 <<*pb<<endl //第1個元素的值 <<(*pb+2)<<endl; //第3個元素的值 cout<<"==========函數指針的應用=========="<<endl; int f(); //界說函數 int (*pf)(); //界說函數指針 pf=f; //賦值函數指針,行將函數的首地址賦值給指針pf (*pf)(); //經由過程函數指針挪用函數 }
成果以下圖:
3、數組指針與指針數組
數組指針是一個指針變量,它指向一個數組,即指向一個數組的指針就是數組指針;而指針數組是一個只包括指針元素的數組,它的元素可以指向雷同類型的分歧對象。
4、函數指針與指針函數
函數指針就是指向函數的存儲空間地址的指針,可以對函數指針停止賦值而且經由過程函數指針來挪用函數,它的實質是一個指針。而指針函數只是解釋它是一個前往值為指針的函數,其實質是一個函數。
5、援用傳遞、值傳遞和指針傳遞
C++說話中,函數的參數和前往值的傳遞方法有3種:即值傳遞、援用傳遞和指針傳遞。
(1)、值傳遞
形參是實參的拷貝,轉變形參的值其實不會影響內部實參的值。從被挪用函數的角度來講,值傳遞是單向的(實參->形參),參數的值只能傳入,不克不及傳出。當函數外部須要修正參數,而且不願望這個轉變影響挪用者時,采取值傳遞。
(2)、指針傳遞
形參為指向實參地址的指針,當對形參的指向操作時,就相當於對實參自己停止的操作。
(3)、援用傳遞
形參相當因而實參的“別號”,對形參的操作其實就是對實參的操作,在援用傳遞進程中,被調函數的情勢參數固然也作為部分變量在棧中開拓了內存空間,然則這時候寄存的是由主調函數放出去的實參變量的地址。被調函數對形參的任何操作都被處置成直接尋址,即經由過程棧中寄存的地址拜訪主調函數中的實參變量。正由於如斯,被調函數對形參做的任何操作都影響了主調函數中的實參變量。
最初,總結一下指針和援用的雷同點和分歧點:
雷同點:
都是地址的概念,指針指向一塊內存,它的內容是所指內存的地址;而援用則是某塊內存的別號。
分歧點:
指針是一個實體,而援用僅是個體名;
援用只能在界說時被初始化一次,以後弗成變;指針可變;援用“從一而終”,指針可以“三心二意”;
援用沒有const,指針有const,const的指針弗成變;(詳細指沒有int& const a這類情勢,而const int& a是有的,前者指援用自己即別號弗成以轉變,這是固然的,所以不須要這類情勢,後者指援用所指的值弗成以轉變)
援用不克不及為空,指針可認為空;
“sizeof 援用”獲得的是所指向的變量(對象)的年夜小,而“sizeof 指針”獲得的是指針自己的年夜小;
指針和援用的自增(++)運算意義紛歧樣;
援用是類型平安的,而指針不是(援用比指針多了類型檢討)。
以上就是本文的全體內容,願望對年夜家的進修有所贊助。