深入解讀C++中的指標變數_C 語言

來源:互聯網
上載者:User

指標變數是一種特殊的變數,它和以前學過的其他類型的變數的不同之處是:用它來指向另一個變數。為了表示指標變數和它所指向的變數之間的聯絡,在C++中用“*”符號表示指向,例如,i_pointer是一個指標變數,而*i_pointer表示i_pointer所指向的變數。

下面兩個語句作用相同:

  i=3;  *i_pointer=3;


定義指標變數

C++規定所有變數在使用前必須先定義,即指定其類型。在編譯時間按變數類型分配儲存空間。對指標變數必須將它定義為指標類型。先看一個具體例子:

  int i, j;              //定義整型變數i,j  int *pointer_1, *pointer_2;    //定義指標變數*pointer_1,*pointer_2


第2行開頭的int是指:所定義的指標變數是指向整型資料的指標變數。也就是說,指標變數pointer_1和pointer_2隻能用來指向整型資料(例如i和j),而不能指向浮點型變數a和b。這個int就是指標變數的基底類型。指標變數的基底類型用來指定該指標變數可以指向的變數的類型。

定義指標變數的一般形式為:
    基底類型 *指標變數名;
下面都是合法的定義:

  float *pointer_3; // pointer_3是指向單精確度型資料的指標變數  char *pointer_4; // pointer_4是指向字元型資料的指標變數


請注意:指標變數名是pointer_3和pointer_4,而不是*pointer_3和*pointer_4,即“*”不是指標變數名的一部分,在定義變數時在變數名前加一個“*”表示該變數是指標變數。

那麼,怎樣使一個指標變數指向另一個變數呢?只需要把被指向的變數的地址賦給指標變數即可。例如:

  pointer_1=&i; //將變數i的地址存放到指標變數pointer_1中  pointer_2=&j; //將變數j的地址存放到指標變數pointer_2中


這樣,pointer_1就指向了變數i,pointer_2就指向了變數j。見圖。


一般的C++編譯系統為每一個指標變數分配4個位元組的儲存單元,用來存放變數的地址。

在定義指標變數時要注意:不能用一個整數給一個指標變數賦初值,在定義指標變數時必須指定基底類型。
引用指標變數

有兩個與指標變數有關的運算子:
&取地址運算子。
 *指標運算子(或稱間接訪問運算子)。

例如:&a為變數a的地址,*p為指標變數p所指向的儲存單元。

【例】通過指標變數訪問整型變數。

#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; //對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;}

運行結果為:

100 10  (a和b的值)100 10  (*pointer_1和*pointer_2的值)

請對照圖分析。


下面對“&”和“*”運算子再做些說明:
1) 如果已執行了“pointer_1=&a;”語句,請問&*pointer_1的含義是什嗎?“&”和“*”兩個運算子的優先順序別相同,但按自右至左方向結合,因此先進行*pointer_1的運算,它就是變數a,再執行&運算。因此,&*pointer_1與&a相同,即變數a的地址。

如果有pointer_2=&*pointer_1;它的作用是將&a(a的地址)賦給pointer_2,如果pointer_2原來指向b,經過重新賦值後它已不再指向b了,而也指向了a。


2) *&a的含義是什嗎?先進行&a的運算,得a的地址,再進行*運算,即&a所指向的變數,*&a和*pointer_1的作用是一樣的(假設已執行了“pointer_1=&a;”),它們等價於變數a。即*&a與a等價,見圖。

【例】輸入a和b兩個整數,按先大後小的順序輸出a和b(用指標變數處理)。

解此題的思路是:設兩個指標變數p1和p2,使它們分別指向a和b。使p1指向a和b中的大者,p2指向小者,順序輸出*p1,*p2就實現了按先大後小的順序輸出a和b。按此思路編寫程式如下:

#include <iostream>using namespace std;int main( ){  int *p1,*p2,*p,a,b;  cin>>a>>b; //輸入兩個整數  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;}

運行情況如下:

4578a=45 b=78max=78 min=45

輸入a的值45,b的值78,由於a<b,將p1的值和p2的值交換,即將p1的指向與p2的指向交換。


請注意,這個問題的演算法是不交換整型變數的值,而是交換兩個指標變數的值。


相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.