程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> 詳解C++中的指針、數組指針與函數指針

詳解C++中的指針、數組指針與函數指針

編輯:關於C++

詳解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 指針”獲得的是指針自己的年夜小;

指針和援用的自增(++)運算意義紛歧樣;

援用是類型平安的,而指針不是(援用比指針多了類型檢討)。

以上就是本文的全體內容,願望對年夜家的進修有所贊助。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved