深入解讀C++中的指針變量
指針變量是一種特殊的變量,它和以前學(xué)過的其他類型的變量的不同之處是:用它來指向另一個(gè)變量。為了表示指針變量和它所指向的變量之間的聯(lián)系,在C++中用“*”符號(hào)表示指向,例如,i_pointer是一個(gè)指針變量,而*i_pointer表示i_pointer所指向的變量。
下面兩個(gè)語句作用相同:
i=3; *i_pointer=3;
定義指針變量
C++規(guī)定所有變量在使用前必須先定義,即指定其類型。在編譯時(shí)按變量類型分配存儲(chǔ)空間。對(duì)指針變量必須將它定義為指針類型。先看一個(gè)具體例子:
int i, j; //定義整型變量i,j int *pointer_1, *pointer_2; //定義指針變量*pointer_1,*pointer_2
第2行開頭的int是指:所定義的指針變量是指向整型數(shù)據(jù)的指針變量。也就是說,指針變量pointer_1和pointer_2只能用來指向整型數(shù)據(jù)(例如i和j),而不能指向浮點(diǎn)型變量a和b。這個(gè)int就是指針變量的基類型。指針變量的基類型用來指定該指針變量可以指向的變量的類型。
定義指針變量的一般形式為:
基類型 *指針變量名;
下面都是合法的定義:
float *pointer_3; // pointer_3是指向單精度型數(shù)據(jù)的指針變量 char *pointer_4; // pointer_4是指向字符型數(shù)據(jù)的指針變量
請(qǐng)注意:指針變量名是pointer_3和pointer_4,而不是*pointer_3和*pointer_4,即“*”不是指針變量名的一部分,在定義變量時(shí)在變量名前加一個(gè)“*”表示該變量是指針變量。
那么,怎樣使一個(gè)指針變量指向另一個(gè)變量呢?只需要把被指向的變量的地址賦給指針變量即可。例如:
pointer_1=&i; //將變量i的地址存放到指針變量pointer_1中 pointer_2=&j; //將變量j的地址存放到指針變量pointer_2中
這樣,pointer_1就指向了變量i,pointer_2就指向了變量j。見圖。
一般的C++編譯系統(tǒng)為每一個(gè)指針變量分配4個(gè)字節(jié)的存儲(chǔ)單元,用來存放變量的地址。
在定義指針變量時(shí)要注意:不能用一個(gè)整數(shù)給一個(gè)指針變量賦初值,在定義指針變量時(shí)必須指定基類型。
引用指針變量
有兩個(gè)與指針變量有關(guān)的運(yùn)算符:
&取地址運(yùn)算符。
*指針運(yùn)算符(或稱間接訪問運(yùn)算符)。
例如:&a為變量a的地址,*p為指針變量p所指向的存儲(chǔ)單元。
【例】通過指針變量訪問整型變量。
#include <iostream> using namespace std; int main( ) { int a,b; //定義整型變量a,b int *pointer_1,*pointer_2; //定義指針變量*pointer_1,*pointer_2 a=100;b=10; //對(duì)a,b賦值 pointer_1=&a; //把變量a的地址賦給pointer_1 pointer_2=&b; //把變量a的地址賦給pointer_2 cout<<a<<" "<<b<<endl; //輸出a和b的值 cout<<*pointer_1<<" "<<*pointer_2<<endl; //輸出*pointer_1和*pointer_2的值 return 0; }
運(yùn)行結(jié)果為:
100 10 (a和b的值) 100 10 (*pointer_1和*pointer_2的值)
請(qǐng)對(duì)照?qǐng)D分析。
下面對(duì)“&”和“*”運(yùn)算符再做些說明:
1) 如果已執(zhí)行了“pointer_1=&a;”語句,請(qǐng)問&*pointer_1的含義是什么?“&”和“*”兩個(gè)運(yùn)算符的優(yōu)先級(jí)別相同,但按自右至左方向結(jié)合,因此先進(jìn)行*pointer_1的運(yùn)算,它就是變量a,再執(zhí)行&運(yùn)算。因此,&*pointer_1與&a相同,即變量a的地址。
如果有pointer_2=&*pointer_1;它的作用是將&a(a的地址)賦給pointer_2,如果pointer_2原來指向b,經(jīng)過重新賦值后它已不再指向b了,而也指向了a。
2) *&a的含義是什么?先進(jìn)行&a的運(yùn)算,得a的地址,再進(jìn)行*運(yùn)算,即&a所指向的變量,*&a和*pointer_1的作用是一樣的(假設(shè)已執(zhí)行了“pointer_1=&a;”),它們等價(jià)于變量a。即*&a與a等價(jià),見圖。
【例】輸入a和b兩個(gè)整數(shù),按先大后小的順序輸出a和b(用指針變量處理)。
解此題的思路是:設(shè)兩個(gè)指針變量p1和p2,使它們分別指向a和b。使p1指向a和b中的大者,p2指向小者,順序輸出*p1,*p2就實(shí)現(xiàn)了按先大后小的順序輸出a和b。按此思路編寫程序如下:
#include <iostream> using namespace std; int main( ) { int *p1,*p2,*p,a,b; cin>>a>>b; //輸入兩個(gè)整數(shù) p1=&a; //使p1指向a p2=&b; //使p2指向b if(a<b) //如果a<b就使p1與p2的值交換 { p=p1;p1=p2;p2=p; //將p1的指向與p2的指向交換 } cout<<"a="<<a<<" b="<<b<<endl; cout<<"max="<<*p1<<" min="<<*p2<<endl; return 0; }
運(yùn)行情況如下:
4578↙ a=45 b=78 max=78 min=45
輸入a的值45,b的值78,由于a<b,將p1的值和p2的值交換,即將p1的指向與p2的指向交換。
請(qǐng)注意,這個(gè)問題的算法是不交換整型變量的值,而是交換兩個(gè)指針變量的值。
- C++靜態(tài)成員變量和靜態(tài)成員函數(shù)的使用方法總結(jié)
- 詳解C++中變量的初始化規(guī)則
- 實(shí)例講解在C++的函數(shù)中變量參數(shù)及默認(rèn)參數(shù)的使用
- 詳解C++中的指針結(jié)構(gòu)體數(shù)組以及指向結(jié)構(gòu)體變量的指針
- C++中結(jié)構(gòu)體的類型定義和初始化以及變量引用
- 簡單介紹C++中變量的引用
- C++編程中變量的聲明和定義以及預(yù)處理命令解析
- 深入理解C++中變量的存儲(chǔ)類別和屬性
- 深入理解C++編程中的局部變量和全局變量
- C++中的局部變量、全局變量、局部靜態(tài)變量、全局靜態(tài)變量的區(qū)別
相關(guān)文章
C語言學(xué)習(xí)之標(biāo)識(shí)符的使用詳解
C語言標(biāo)識(shí)符是用于表示變量、函數(shù)、常量、類型等程序元素的名稱,這篇文章將通過一些簡單的示例為大家介紹一下C語言標(biāo)識(shí)符的使用,需要的可以參考一下2023-05-05C語言實(shí)現(xiàn)猜數(shù)字小游戲的示例代碼
猜數(shù)字小游戲是我們小時(shí)候喜歡我們一個(gè)經(jīng)典小游戲。本文將用C語言實(shí)現(xiàn)這一經(jīng)典游戲,文中的示例代碼講解詳細(xì),感興趣的可以了解一下2022-08-08C++11 強(qiáng)類型枚舉相關(guān)總結(jié)
這篇文章主要介紹了C++11 強(qiáng)類型枚舉的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)使用c++11,感興趣的朋友可以了解下2021-02-02淺析ORB、SURF、SIFT特征點(diǎn)提取方法以及ICP匹配方法
這篇文章主要為大家介紹了常用的特征點(diǎn)提取方法(ORB、SURF、SIFT)和ICP匹配方法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2021-12-12