摘 要: 指針是C++語言中最難掌握的概念之一,錯誤地使用指針所帶來的后果往往是很嚴重的,有時甚至會導致系統崩潰。因此,正確使用指針是C++語言學習的重點和難點。
關鍵字: C++指針 地址 解析
計算機內存是由二進制位組成的,為了便于訪問和管理,每8位組成一個字節,一個字節稱為一個存儲單元。通常,系統對每個存儲單元按期順序進行編號,編號能惟一確定任何一個字節的位置,就像根據房間號能惟一確定任何一個房間一樣,于是編號被形象地稱為地址。程序所處理的每一個數據必須存放于計算機內存中才能運行,這些數據按其所屬的數據類型,需要占據一定數量的連續的存儲單元,而這些存儲單元都位于內存的某個特定位置,都有一個惟一的起始地址。
因為地址指示了字節在存儲器中的位置,所以地址也被形象地稱為指針。指針是一個存儲單元的地址值,用來存放地址(即指針)的變量稱為指針變量,常常將指針變量簡稱為指針。C++中的指針按照它所指向的對象可以劃分為變量指針、數組指針、函數指針、對象指針、類的數據成員指針和類的成員函數指針。
一、變量的指針
1.設type代表任意一種基本說明符,則:
type x;//聲明了一個type型變量x。
type*p;//聲明了一個type型指針變量p,“*”表示聲明的p是一個指針變量,p所指向的變量的類型是type型。
p=&x;//指針變量p指向了變量x,&是地址符號,&x表示變量x的地址。只有變量x的數據類型和指針變量p所指向的變量的數據類型相同才可作此操作。
2.可聲明多級指針變量,如:
type**p;//聲明了一個指向type類型的二級指針變量p。
二、數組與指針
1.數組的指針
type a[3];//聲明了一個具有三個type類型數據的數組。
在這里a有兩個涵義:
①作為數組名,表示數組這個整體。
②表示這個數組在內存所占的一段連續的存儲單元的起始地址,也就是這個數組中第一個元素的地址,即&a[0]。
type*p;//聲明了一個type型指針變量p。
p=a;//將數組的起始地址賦給指針變量,使指針變量p指向數組,相當于p=&a[0]。
2.數組指針
type(*p)[3];//聲明了一個指針p,這個指針指向具有3個的type類型元素的數組。
3.指針數組
type*p[3];//聲明了一個具有三個指針元素的數組,每個元素都是可以指向type類型數據的指針變量
三、函數與指針
1.返回指針值的函數
函數的返回值可以是整型、浮點型、字符型等基本類型,也可以是指針類型。如:int*f(),則函數的返回值是一個指向整型數據的指針,稱這個函數為返回指針值的函數。
type*(形參表)
{
……
}//定義了一個返回指針值的函數
void main()
{
type*p;
p=f(實參表);//函數調用,p接收的是函數f返回的指向type類型數據的指針
……
}
2.函數指針
函數名就是函數的入口地址,函數指針就是指向函數入口地址的指針變量,即存放函數入口地址的變量。
type(*p)(type x);//定義了一個名為p的函數指針
type f(type x)
{
……
}//定義名為f的type函數。
p=f;//將函數f()的入口地址賦給函數指針變量p,即使指針變量p指向函數f(),只能將與函數指針變量具有同類型、同參數的函數名賦給函數指針變量。
四、對象指針
設有一個類A,a和f()分別是類A公有數據成員和公有成員函數,則:
A t;//聲明了一個類A的對象t,則&t是對象t的地址。
A*p;//聲明了一個指向類A的指針變量p。
p=&t;//將指針變量p指向了類A的對象t。
用指針p調用對象t的數據成員和成員函數的格式為:p→a;和p→f()。
五、類的成員數據指針
設t是A類的一個對象,a是A的一個非靜態type型成員數據,s是A的一個靜態type1型數據成員,則:
1.①A∷a的相對指針常量為&A∷a;
②A∷s的物理指針常量為&A∷s。
2.①可以指向A類的type型非靜態成員的指針p1的聲明格式為:type A∷*p1;
②可以指向A類type型靜態成員的指針p2的聲明格式為:type1*p2。
3.①使p1指向A∷a的方式為:用& A∷a初始化p1或在聲明了p1后向p1賦值;
②使p2指向A∷s的方式為:用& A∷s初始化p2或在聲明了p2后向p2賦值。
4.①用p1而不用a來訪問t.a的格式為:t.*p1;
②用p2而不用s來訪問t.s的表達式為*p2。
六、類的成員函數指針
設t是A類的一個對象,f(FL1)是A類的一個type型非靜態的函數成員,g(FL2)是A類的一個type1型靜態函數成員,則:
1.①A∷f()的相對指針常量為A∷f;
②A∷g()的物理指針常量為A∷g。
2.①可以指向A的非靜態type型形參表為FL1的函數成員的指針P1的聲明格式為type(A∷*p1)(FL1);
②可以指向A的靜態type1型形參表為FL2的函數成員的指針p2的聲明格式為:type1(*p2)(FL2)。
3.①使p1指向A∷f()的方式是:用A∷f初始化p1或在聲明了p1后向p1賦值;
②使p2指向A∷g()的方式是:用A∷g初始化p2或者在聲明了p2之后向p2賦值。
4.①用p1而不用f來訪問t.f()的格式為:(t.*p1)(實參表);這里的“*”為指針說明符而不是指針運算符;
②用p2而不用g()來訪問t.g()的格式為:p2(實參表)。
指針是C++語言中最難掌握的概念之一,錯誤地使用指針所帶來的后果往往是很嚴重的,有時甚至會導致系統崩潰。因此,正確使用指針是C++語言學習的重點和難點。
參考文獻:
[1]譚浩強.C++語言程序設計.清華大學出版社.
[2]周正德,侯正昌.C++程序設計(第2版).電子工業出版社.
[3]鄧振杰.C++程序設計.人民郵電出版社.
[4]余建軍,張鐵頭.C++程序設計.中國計劃出版社.