C++ 指針 部分

基本知識:在內存中的每一個字節都有一個編號,這就是「地址」,至關於旅館中的房間號。記住,內存單元的地址和內存單元的內容是兩個不一樣的概念。c++

程序在編譯以後,就已經將變量名轉換成變量地址,對變量值的存取都是經過地址進行的。按照變量地址存取變量值的方式稱爲「直接存取方式」,或直接訪問方式。另外一種是「間接存取方式」:將變量i的地址存放在另外一個變量中。能夠在變量中定義這樣的一些變量,專門是用來存放地址的。例如,i_pointer用來存放一個整形變量的地址,編譯系統給這個變量分配4個字節(假設是3010到3013字節),經過下面語句將i的起始地址(3000)存放到i_pointer中。----->    i_pointer=&i;函數

其中&是取地址運算符,&i是變量i的地址。執行此語句後,i_pointer的值就是3000(即變量i所佔用的起始地址)。若要取出i的值,能夠直接訪問,也能夠採用間接方式:先找到存放「i的地址」的變量i_pointer。而後從中取出i的地址(3000),而後到3000開始的4個字節中取出i的值(3)。因爲經過地址能找到所需的變量單元,因此說,地址指向該變量單元。所以將其形象化的稱爲「指針」。意思是經過它能訪問以它爲地址的內存單元。一個變量的地址稱爲該變量的指針。例如整形變量i的地址是3000,所以3000就是整形變量i的指針。------------------------------------》》指針就是地址,地址也就是指針。spa

1.變量和指針指針

變量的指針就是變量的地址。用來存放變量地址的變量是指針變量。指針變量是指向另一個變量。c++中用「*」符號來表示「指向」,例如i_pointer是一個指針變量,而*i_pointer表示i_pointer所指向的變量。內存

2.定義指針變量io

記住:全部變量在使用前必須定義,也就是指定其類型,這樣是爲了在編譯時能夠按照類型分配存儲空間。編譯

int *i_pointer,*j_pointer。這裏開頭的int是指:所定義的指針變量是指向整形數據的指針變量,也就是說這兩個變量只能存放整形數據的變量的地址,而不能存放浮點型或其餘類型的數據的地址。變量

注意:引用

(1)i_pointer,j_pointer是變量名,而*i_pointer,*j_pointer不是變量名,「*」不是指針變量的一部分,在定義變量時在變量名前加上一個「*」表示該變量是指針變量。程序

(2)不能用一個整數給一個指針變量賦初值,int *i_pointer=2000是錯誤的。能夠將已經定義的變量的地址做爲指針變量的初值。int i;int *i_pointer=&i;

(3)在定義指針變量時,必須指定基本類型。由於在「使指針移動1個位置」時或者「使指針值加1」時,在不一樣的類型中,使地址值增長的字節數是不一樣的。例如,整形數據,使「指針加1」意味着地址值加4字節,而對於雙精度數據,則意味着地址值增長8個字節。

3.引用指針變量

有兩個與指針變量有關的運算符:

(1)& 取地址運算符;(2)指針運算符(或稱間接訪問運算符)

如:&a爲變量a的地址,*p爲指針變量p所指向的單元。

關於「*」和「&」的一些說明:

一。「&*pointer_1=&a」的含義是什麼?「*」和「&」的優先級相同,因此是自左至右的方式結合。所以是先進行*pointer_1的運算,它就是變量a。在執行&運算,便可獲得a的地址。

二。」*&a「的含義是什麼?先進行&a運算,獲得a的地址,在進行*運算,獲得a所指向的變量。

4.指針做爲函數參數

函數的參數不只能夠是整型,浮點型,字符型等數據,還能夠是指針類型。做用是將一個變量的地址傳送給被調用的形參

注意:在調用函數的時候,函數的形參應該有int,如void swap(int *pa,int *pb){   };而調用實參時候,只寫變量,不用寫類型,如swap(pointer_1,pointer_2)。

 void swap(int x,int y)

{int temp;

   temp=x;

   x=y;

   y=temp;

}

經過實參void swap(a,b)調用void swap(int x,int y)來進行值傳遞。a的值傳給了x,b的值傳給了y。在執行完調用後,x和y的值換了,可是實參a和b的值並無換,也就是說因爲虛實結合是採用單向的「值傳遞」方式,只能從實參向形參傳遞,形參值的改變沒法回傳給實參。

可是,可使用指針變量指向的變量值發生變化,函數調用後,這些變量值的變化依然保留下來了,這樣就實現了「經過調用函數使變量的值發生變化,在主調函數中使用這些改變了的值」的目的。

感悟:若是想經過函數調用獲得n個要改變的值,能夠採用下面的步驟:

         1.在主調函數中設n個變量,用n個指針變量指向他們;

         2.編寫被調函數,其形參爲n個指針變量,這些形參指針變量應當與主調函數中的n個指針變量具備相同的基類型;

         3.在主調函數中將n個指針變量做實參,將他們的值(是地址)傳給所調用函數的n個形參指針變量,這樣,形參指針變量也指向這n個變量;

         4.經過形參指針變量的指向,改變該n個變量的值;

         5.在主調函數中就可使用這些改變了值的變量。

切記:實參變量和形參變量之間的數據傳遞是單向的「值傳遞」方式。指針變量做爲函數參數也要遵照這一規則。

當看到相似於這樣的一些函數:viod exchange(int *,int *,int *)和void swap(int *,int *)的時候;直接應該很快地斷定這是聲明基本類型爲整型的指針變量。

相關文章
相關標籤/搜索