指標引用位址的筆記

2022-07-23 08:27:10 字數 3150 閱讀 2176

位址

在c++ 中,位址標號使用十六進製制表示。取乙個變數的位址使用「&」符號,只有變數

才存在記憶體位址,常量沒有位址(不包括const定義的偽常量)。例如,對於數

字100,我們無法取出它的位址。取出的位址是一-個常量值,

無法再對其取位址了。

2.指標

指標的定義使用「type*",type 為資料型別,任何資料型別都可以定義指標。指標本

身也是一種資料型別,也就是說type*也是資料型別,所以例如int* a,a代表的就是某個位址,int*是資料型別而已。它用於儲存各種資料型別在記憶體中的位址。指標變數同樣可以取出地

址,所以會出現多級指標。

由於指標儲存的資料都是位址,所以無論什麼型別的指標都佔4個位元組,即指標本身佔4個位元組,它的資料型別解釋的是對應位址的資料而已可不是指標,指標只儲存了存放資料的首位址,並沒有說在**結束,所以就是資料型別來決定資料的結束位址

例如,同一位址,不同的資料型別進行訪問,取出的內容也不一樣

所以我們有

2.1各型別指標的工作方式如下

使用了int char short三種方式對變數nvar的位址進行解釋。變數nvar在記憶體中的數

首位址從「78」開始。指標pnvar為int型別指標,以int 型別在記憶體

據為「78 5634 12」,

中占用的空間大小和排列方式對位址進行解釋,然後取出資料。int型別佔4位元組記憶體空間,

以小尾方式排列,取出內容為「12345678」,是乙個十六進製制的數字。同理,pcvar、psnvar

將會按照它們的指標型別對位址資料進行解釋。指標的取內容操作分為兩個步驟:先取出指

針中儲存的位址資訊,然後針對這個位址進行取內容,也就是乙個間接定址的過程,這也是

識別指標的重要依據。該示例執行結果如下。

12345678

00008078

30305678

press any key to ont inue

如上各型別指標解釋位址的結果

通過上述的指標取內容的過程可得出結論,所有型別的指針對位址的解釋都取自於自身指標型別。

2.2.1指標支援的運算

指標都支援哪些運算符號呢? 在c++ 中,所有指標型別只支援加法和減法。指標是用於

儲存資料位址、解釋位址而存在的。因此,只有加法與減法才有意義,其他運算對於指標而

言沒有任何意義

2.2.1.1指標加法

指標加法用於位址偏移,但指標的加法並不像數學中的加法那樣簡單。指標加1後,指

針內儲存的位址值並不一定會加1,具體的值取決於指標型別,如指標型別為int,位址值將

會加4。這個4 是根據型別大小所得到的值。c++ 為什麼要用這種煩瑣的位址偏移方法呢?

當指標中儲存的位址為陣列首位址時,為了能夠利用指標加1後訪問到陣列內下一成員,所

以加的是型別長度,而非數字1,

2.2.1.2所以我們得出指標定址公式:

目標位址=首位址加偏移量

type*p;

p+n的目標位址=首位址+sizeof(指標型別)*n

2.2.1.3指標減法

套用公式,得到的位址值會小於首地

在偏移量為負數的情況下,也可以運用此公式。

址,這時指標是在向後進行定址。所以指標可以做減法操作,但乘法與除法對於指標定址而

結果為有符號整

言是沒有意義的。兩指標做減法操作是在計算的兩個位址之間的元素個數,

數,進行減法操作的兩指標必須是同類指標相減。可用於兩指標中的位址比較,也可用於其

他場合,比如求陣列元素個數,其計算公式如下:

type *p,*q; /1這裡用type泛指某型別的指標

11省略指標賦值**

p-q= ((int)p- (int)q) /sizeof(指標型別type)

另外,兩指標相加也是沒有意義的。

將指標訪問公式與指標定址公式相結合後,可針對所有型別的指標操作。在實際運用中

要靈活使用。同時也要謹慎操作,以免將指標指向意料之外的位址,錯誤地修改位址中的數

據,造成程式的崩潰。

一般做加減就是 type*p ,*q

(int)p-(int)q這樣,*p就是它的資料內容了

指標加1也就是p+1

指標也是一種變數,所以他也可以&取出自己的位址

指標可以根據指標型別對位址對應的資料進行解釋。而乙個位址值無法單獨解釋資料,

對於圖中0x0012ff68 這個位址值,

僅僅憑藉它自己無法說明該位址處對應資料的資訊。

如果是在乙個int 型別的指標中儲存這個位址,就可以將0x0012ff68 這個位址值看做是int

型別資料的起始位址,向後數4 位元組到0x0014ff6c處。將0x0012ff68~0x0014ff6c 中的

資料按整型儲存方式解釋

引用引用的定義使用「type&」,type 為資料型別。在c++中是不可以單獨定義的,並且

在定義時就要進行初始化。引用表示乙個變數的別名,對它的任何操作,本質上都是在操作

它所表示的變數.雖然引用是變數的別名,但是實際上引用就是指標

,引用的儲存方式和指標都是一樣的,都是使用記憶體空間存放位址值,它們的小區別不過是引用是通過編譯器實現定址,而指標要手動定址,指標雖然靈活但是容易失誤,但是引用卻沒有這樣的問題,所以從c++大力提倡引用

位址                                    指標

常量,記憶體標號                                      變數,儲存變數位址                    

不可修改                                                可修改,再次儲存其他變數位址                

不可執行取位址操作                    可以對其執行取位址操作得到位址

僅僅有位址值無法解釋資料              包含對儲存位址的解釋資訊

指標和位址之間的共同點。        

位址                            指標

取出位址對應記憶體中的資料              取出指向位址記憶體中的資料

偏移後取資料,自身不變                  對位址偏移後取資料

求兩個位址的差                        求兩個位址的差

陣列的值引用 位址引用

昨天在修改陣列中某個物件裡面的值的時候,發現修改值時,陣列對應的值也會改變,於是就做了一下幾個測試,發現除了string的陣列不會改之外,其他都會發生改變。我列印了一下陣列某個index的hashcode值以及接收該index的物件的hashcode值,只有string不一樣,結果如下 示例1 js...

引用位址小練習

var student function var bosn new student student.prototype.x 101 student.prototype console.log bosn.x 今天在網上看到了上面這個例子,認為console.log bosn.x 值為undefined...

關於引用位址和路由位址的一點記錄

寫 的時候,出現一些引用位址,一會兒相對引用,一會兒絕對引用,整迷糊了,有時候寫 有時候寫.容易搞錯,而且有時候 不是習慣性的 admin.post login async req,res req.body if email.trim length 0 password.trim length 0 ...