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

深刻解讀C++中的指針變量

編輯:關於C++

深刻解讀C++中的指針變量。本站提示廣大學習愛好者:(深刻解讀C++中的指針變量)文章只能為提供參考,不一定能成為您想要的結果。以下是深刻解讀C++中的指針變量正文


指針變量是一種特別的變量,它和之前學過的其他類型的變量的分歧的地方是:用它來指向另外一個變量。為了表現指針變量和它所指向的變量之間的接洽,在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;
}

運轉情形以下:

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

輸出a的值45,b的值78,因為a<b,將p1的值和p2的值交流,行將p1的指向與p2的指向交流。


請留意,這個成績的算法是不交流整型變量的值,而是交流兩個指針變量的值。


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