C C 有意思的指標(2)

2021-10-24 19:00:56 字數 2159 閱讀 4374

普通變數的定義與使用不存在很大的區別,定義了直接使用即可。但指標的定義與使用是需要作區分的。

int

* p = nullptr;

//定義時*指記憶體位址,或說指向的記憶體區域首位址

cout <<

*p << endl;

//指標使用時*是指對p存放的位址解引用,按p的資料型別讀取記憶體資料。

這對指標型別作解析:

(int*) 型別中的* 為記憶體位址型別,指向某個記憶體位址首位址。再加上旁邊的int則約定這個記憶體區域存放的資料型別為int型,按int型別讀取記憶體4位元組偏移量。

(*p),對p變數中存放的記憶體首位址解引用,讀取記憶體資料。讀取記憶體方式取決於定義時p的型別。

結構體的比較特殊,結構名為首位址,使用->符號或.號過行以首位址為基位址偏移讀取記憶體資料,偏移量的大小取決於結構成員變數型別。

其它基礎資料型別的記憶體模型就不畫了,這裡畫下結構體變數的記憶體模型

#include

#include

#include

#include

#include

#include

#include

using namespace std;

struct stu

;int

main

(int argc,

char

** ar**)

;printf

("the person age:%d, height:%d \n"

, ts->age, ts->height)

;printf

("the person2 age:%d, height:%d \n"

, ts2.age, ts2.height)

;return0;

}

如果使用指標定義結構,則在初始化之前需要申請結構變數空間。結構體使用結構名稱來訪問成員變數,解引用使用符號->,如果是直接生成結構體物件,則使用.(dot)來訪問成員。使用->相當於是在結構體首位址時進行偏移,偏移大小為成員資料型別所點記憶體大小。

指標變數只是乙個正常的變數,只是內存放的資料值為其它記憶體址首位址。二級指標變數,也只是乙個正常的變數,只是記憶體裡存放的是指標的指標變數即(int**)型別。

int

main

(int argc,

char

** ar**)

;struct stu* tp =

&t; tp->age =

110;

tp->height =

180;

struct stu*

* tpp =

&tp;

//對變數使用取位址符&,相當於變數增加乙個*位址符

printf

("the stu structure addr:%p\n"

,*tpp)

;printf

("the stu first member age addr:%p \n"

,&t.age)

;printf

("the person age:%d\n",(

*tpp)

->age)

;return0;

} 執行結果:

the stu structure addr:

0x7ffd72db4630

//結構體首位址

the stu first member age addr:

0x7ffd72db4630

//結構體第乙個成員變數位址與結構體首位址相同。

the person age:

110

對p1進行解引用一次p1則, p1變數的型別由(int** )變成 (int)型別,但還是指標型別。再進行一次解引用則是按struct stu型別讀取記憶體資料。

指標的解引用,引用時碰到什麼型別就按什麼型別資料讀取記憶體,一層層的從右向左剝(((struct stu)struct stu*)struct stu**)。

二級指標直接這樣使用沒什麼效果,一般是在申請記憶體或二維陣列中使用到二級指標,用來方便對資料遍歷訪問。

C C 有意思的指標(1)

在c c 中指標是乙個常用的型別,但同時指標也是乙個重要且有意思的概念。這個概念說大了與量子糾纏什麼還能聯絡在一起,也可以與宇宙空間聯絡起來。而我更喜歡它另外乙個角度的理解 玄幻 裡男主角的空間戒指。記得以前看玄幻類 時常羨慕男主角的空間儲物戒指,想放什麼就放什麼,還可以在信物戒指裡面住,甚至生活都...

C C 有意思的指標(4)

指標可以讓我們申請記憶體空間,並使用指標讀寫指定的記憶體區域。但還有另外一種情況,我們想把資料放到指定的記憶體區域,或說在某些暫存器與記憶體統一編址的平台,想要訪問某段暫存器,並更改暫存器的值。通過檢視晶元手冊,知道裝置暫存器位址,然後通過把位址值轉換成指針對這段暫存器記憶體進行讀寫。我們通過取位址...

有意思的題目2

http狀態碼 cdn 內容分發網路是一種透過網際網路互相連線的電腦網路系統,提供高效能 可擴充套件性 及低成本的網路將內容傳遞給使用者。tcp協議是面向連線的,而http是無狀態的,面向連線和無狀態怎麼感覺好像有點矛盾呢?不矛盾,乙個是面向鏈結的,乙個是無連線的。面向鏈結的可靠些,無連線的就不那麼...