位址
在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 ...