指針概念梳理

梳理一下指針的知識要點,幫助他人理解指針的相關概念,希望能幫到你。
小明接到一個任務:在A籃裏有m個蘋果,在B籃裏有n個蘋果,現在需要把A和B籃裏的蘋果交換,試問交換後兩籃裏蘋果的個數。請用編程代碼予以實現。
小明很快完成了程序的編寫:
#include
using namespace std;
int main()
{
int m,n,temp;
cin>>m>>n;
cout<<”A apple number”<<m<<endl;
cout<<”B apple number“<<n<<endl;
temp=m;//交換兩個數據
m=n;
n=temp;
cout<<”A apple number”<<m<<endl;
cout<<”B apple number“<<n<<endl;
return 0;
}
這個時候,小明突然想到可以把交換兩個數據的代碼編寫成一個函數。這樣,以後有多組AB籃子時候,可以很方便的交換這兩個數據:
#include
using namespace std;
void swap(int a,int b)
{
int temp;
temp=a;
a=b;
b=temp;
}
int main()
{
int m,n,temp;
cin>>m>>n;
cout<<”A apple number”<<m<<endl;
cout<<”B apple number“<<n<<endl;
swap(a,b);
cout<<”A apple number”<<m<<endl;
cout<<”B apple number“<<n<<endl;
return 0;
}
然而,令小明喫驚的是,兩次輸出的值是一樣的,也就是說,函數並沒有起到預想中作用。
小明百思不得其解。於是他翻閱了資料,發現:函數在執行時會開闢新的存儲空間,在實際參數與形式參數相結合後,函數利用新的存儲空間對數據進行函數體內語句所要求的處理,並返回數值。小明發現,自己的swap函數的返回值類型是void類型,也就是說函數並沒有返回值。執行函數體時函數在新的存儲空間裏進行的數據的交換僅僅是針對形式參數的交換,對我們真正想要處理的數據並沒有進行處理。(就像A在武漢,B在上海,A的替身a在長沙,B的替身b在蘇州,我們本來是想要AB交換地理位置,可是我們所編寫的函數,僅僅讓他們的替身交換了位置,並沒有對他們本人造成影響。)小明想:那函數能直接訪問我存儲數據真身的存儲空間就好了。他再次查閱資料發現了一個叫指針變量的東西,能存儲變量的地址,於是他利用手上的資料,對程序進行了修改。
#include
using namespace std;
void swapnum(int *pa,int *pb)
{
int temp;
temp=*pa;
*pa=*pb;
*pb=temp;
}
















































int main()
{
int m,n;
int *pm=&m,*pn=&n;
cin>>m>>n;
cout<<“A apple number”<<m<<endl;
cout<<“B apple number”<<n<<endl;
swapnum(pm,pn);
cout<<“A apple number”<<m<<endl;
cout<<“B apple number”<<n<<endl;
return 0;
}
我們也來看看小明找到的資料是什麼
存放變量的地址需要一種特殊類型的變量,這種數據類型就是指針,具有指針類型的變量被稱爲指針變量,他是專門用於存放變量地址值的變量。
指針變量的定義:類型關鍵字 *指針變量名;
類型關鍵字指明瞭指針變量所指向的數據類型。
如 int *pa;意爲pa是一個指針變量,且指向的數據類型爲整形變量。
int *pa,*pb;可以定義兩個指向相同數據類型的變量。
指針變量的初始化:
pa=&a;讀爲指針變量pa指向a變量的地址,可理解爲取a變量的地址賦給a變量。
也可在定義的同時進行初始化:int pa = &a;
間接尋址運算符
:通過這個運算符,我們可以很輕鬆的訪問它所修飾的指針變量指向地址存儲的數據。所以,pa你可以把它當作一個變量來看待。
此時我們來分辨兩種




















  1.     int *pa=&a;
    
  2.     int *pa;
       pa=&a;
    
  3.     int *pa=&a;
       a=1;
       cout<<*pa;
    

1中的是指針變量的定義及初始化中的,它不是一個運算符。
2中的*同1;
3中上面的第一條語句是定義,而下面的cout語句是間接尋址運算符。
這就是小明所找到的資料,因此,小明也可以清楚的解釋爲什麼要這樣修改程序了:
#include
using namespace std;
void swapnum(int *pa,int *pb)
{
int temp;
temp=*pa;
*pa=*pb;
*pb=temp;
}











int main()
{
int m,n;
int *pm=&m,*pn=&n;//定義兩個指針變量分別指向m,n
cin>>m>>n;
cout<<“A apple number”<<m<<endl;
cout<<“B apple number”<<n<<endl;
swapnum(pm,pn);//注1
cout<<“A apple number”<<m<<endl;
cout<<“B apple number”<<n<<endl;
return 0;
}
注一:此時,傳入函數的是兩個變量存放的地址,也就是說,函數會直接訪問你存放mn變量的地址對他們來進行修改。從而避免了之前出錯的情況。也就說,函數在內存層面對數據進行了修改。
小明經過艱苦的奮鬥終於完成了他的一個小目標!












發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章