国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频

為什么指針被譽(yù)為 C 語(yǔ)言靈魂?

共 10321字,需瀏覽 21分鐘

 ·

2020-11-03 20:33

是的,這一篇的文章主題是「指針與內(nèi)存模型」

說(shuō)到指針,就不可能脫離開(kāi)內(nèi)存,學(xué)會(huì)指針的人分為兩種,一種是不了解內(nèi)存模型,另外一種則是了解。

不了解的對(duì)指針的理解就停留在“指針就是變量的地址”這句話(huà),會(huì)比較害怕使用指針,特別是各種高級(jí)操作。

而了解內(nèi)存模型的則可以把指針用得爐火純青,各種 byte 隨意操作,讓人直呼 666。

這篇看完,相信你會(huì)對(duì)指針有一個(gè)新的認(rèn)識(shí),坐等打臉?

一、內(nèi)存本質(zhì)

編程的本質(zhì)其實(shí)就是操控?cái)?shù)據(jù),數(shù)據(jù)存放在內(nèi)存中。

因此,如果能更好地理解內(nèi)存的模型,以及 C 如何管理內(nèi)存,就能對(duì)程序的工作原理洞若觀(guān)火,從而使編程能力更上一層樓。

大家真的別認(rèn)為這是空話(huà),我大一整年都不敢用 C 寫(xiě)上千行的程序也很抗拒寫(xiě) C。

因?yàn)橐坏┥锨?,?jīng)常出現(xiàn)各種莫名其妙的內(nèi)存錯(cuò)誤,一不小心就發(fā)生了 coredump...... 而且還無(wú)從排查,分析不出原因。

相比之下,那時(shí)候最喜歡 Java,在 Java 里隨便怎么寫(xiě)都不會(huì)發(fā)生類(lèi)似的異常,頂多偶爾來(lái)個(gè) NullPointerException,也是比較好排查的。

直到后來(lái)對(duì)內(nèi)存和指針有了更加深刻的認(rèn)識(shí),才慢慢會(huì)用 C 寫(xiě)上千行的項(xiàng)目,也很少會(huì)再有內(nèi)存問(wèn)題了。(過(guò)于自信

「指針存儲(chǔ)的是變量的內(nèi)存地址」這句話(huà)應(yīng)該任何講 C ?語(yǔ)言的書(shū)都會(huì)提到吧。

所以,要想徹底理解指針,首先要理解 C 語(yǔ)言中變量的存儲(chǔ)本質(zhì),也就是內(nèi)存。

1.1 內(nèi)存編址

計(jì)算機(jī)的內(nèi)存是一塊用于存儲(chǔ)數(shù)據(jù)的空間,由一系列連續(xù)的存儲(chǔ)單元組成,就像下面這樣,

每一個(gè)單元格都表示 1 個(gè) Bit,一個(gè) bit 在 EE 專(zhuān)業(yè)的同學(xué)看來(lái)就是高低電位,而在 CS 同學(xué)看來(lái)就是 0、1 兩種狀態(tài)。

由于 1 個(gè) bit 只能表示兩個(gè)狀態(tài),所以大佬們規(guī)定 8個(gè) bit 為一組,命名為 byte。

并且將 byte 作為內(nèi)存尋址的最小單元,也就是給每個(gè) byte 一個(gè)編號(hào),這個(gè)編號(hào)就叫內(nèi)存的地址。

這就相當(dāng)于,我們給小區(qū)里的每個(gè)單元、每個(gè)住戶(hù)都分配一個(gè)門(mén)牌號(hào): 301、302、403、404、501......

在生活中,我們需要保證門(mén)牌號(hào)唯一,這樣就能通過(guò)門(mén)牌號(hào)很精準(zhǔn)的定位到一家人。

同樣,在計(jì)算機(jī)中,我們也要保證給每一個(gè) byte 的編號(hào)都是唯一的,這樣才能夠保證每個(gè)編號(hào)都能訪(fǎng)問(wèn)到唯一確定的 byte。

1.2 內(nèi)存地址空間

上面我們說(shuō)給內(nèi)存中每個(gè) byte 唯一的編號(hào),那么這個(gè)編號(hào)的范圍就決定了計(jì)算機(jī)可尋址內(nèi)存的范圍。

所有編號(hào)連起來(lái)就叫做內(nèi)存的地址空間,這和大家平時(shí)常說(shuō)的電腦是 32 位還是 64 位有關(guān)。

早期 Intel 8086、8088 的 CPU 就是只支持 16 位地址空間,寄存器地址總線(xiàn)都是 16 位,這意味著最多對(duì) 2^16 = 64 Kb 的內(nèi)存編號(hào)尋址。

這點(diǎn)內(nèi)存空間顯然不夠用,后來(lái),80286 在 8086 的基礎(chǔ)上將地址總線(xiàn)地址寄存器擴(kuò)展到了20 位,也被叫做 A20 地址總線(xiàn)。

當(dāng)時(shí)在寫(xiě) mini os 的時(shí)候,還需要通過(guò) BIOS 中斷去啟動(dòng) A20 地址總線(xiàn)的開(kāi)關(guān)。

但是,現(xiàn)在的計(jì)算機(jī)一般都是 32 位起步了,32 位意味著可尋址的內(nèi)存范圍是 2^32 byte = 4GB

所以,如果你的電腦是 32 位的,那么你裝超過(guò) 4G 的內(nèi)存條也是無(wú)法充分利用起來(lái)的。

好了,這就是內(nèi)存和內(nèi)存編址。

1.3 變量的本質(zhì)

有了內(nèi)存,接下來(lái)我們需要考慮,int、double 這些變量是如何存儲(chǔ)在 0、1 單元格的。

在 C 語(yǔ)言中我們會(huì)這樣定義變量:

int?a?=?999;
char?c?=?'c';

當(dāng)你寫(xiě)下一個(gè)變量定義的時(shí)候,實(shí)際上是向內(nèi)存申請(qǐng)了一塊空間來(lái)存放你的變量。

我們都知道 int 類(lèi)型占 4 個(gè)字節(jié),并且在計(jì)算機(jī)中數(shù)字都是用補(bǔ)碼(不了解補(bǔ)碼的記得去百度)表示的。

999 換算成補(bǔ)碼就是:0000 0011 1110 0111

這里有 4 個(gè)byte,所以需要四個(gè)單元格來(lái)存儲(chǔ):

有沒(méi)有注意到,我們把高位的字節(jié)放在了低地址的地方。

那能不能反過(guò)來(lái)呢?

當(dāng)然,這就引出了大端和小端。

像上面這種將高位字節(jié)放在內(nèi)存低地址的方式叫做大端

反之,將低位字節(jié)放在內(nèi)存低地址的方式就叫做小端

上面只說(shuō)明了 int 型的變量如何存儲(chǔ)在內(nèi)存,而 float、char 等類(lèi)型實(shí)際上也是一樣的,都需要先轉(zhuǎn)換為補(bǔ)碼。

對(duì)于多字節(jié)的變量類(lèi)型,還需要按照大端或者小端的格式,依次將字節(jié)寫(xiě)入到內(nèi)存單元。

記住上面這兩張圖,這就是編程語(yǔ)言中所有變量的在內(nèi)存中的樣子,不管是 int、char、指針、數(shù)組、結(jié)構(gòu)體、對(duì)象... 都是這樣放在內(nèi)存的。

二、指針是什么東西?

2.1 變量放在哪?

上面我說(shuō),定義一個(gè)變量實(shí)際就是向計(jì)算機(jī)申請(qǐng)了一塊內(nèi)存來(lái)存放。

那如果我們要想知道變量到底放在哪了呢?

可以通過(guò)運(yùn)算符&來(lái)取得變量實(shí)際的地址,這個(gè)值就是變量所占內(nèi)存塊的起始地址。

(PS: 實(shí)際上這個(gè)地址是虛擬地址,并不是真正物理內(nèi)存上的地址

我們可以把這個(gè)地址打印出來(lái):

printf("%x",?&a);

大概會(huì)是像這樣的一串?dāng)?shù)字:0x7ffcad3b8f3c

2.2 指針本質(zhì)

上面說(shuō),我們可以通過(guò)&符號(hào)獲取變量的內(nèi)存地址,那獲取之后如何來(lái)表示這是一個(gè)地址,而不是一個(gè)普通的值呢?

也就是在 C 語(yǔ)言中如何表示地址這個(gè)概念呢?

對(duì),就是指針,你可以這樣:

int?*pa?=?&a;?

pa 中存儲(chǔ)的就是變量 a 的地址,也叫做指向 a 的指針。

在這里我想談幾個(gè)看起來(lái)有點(diǎn)無(wú)聊的話(huà)題:

為什么我們需要指針?直接用變量名不行嗎?

當(dāng)然可以,但是變量名是有局限的。

變量名的本質(zhì)是什么?

是變量地址的符號(hào)化,變量是為了讓我們編程時(shí)更加方便,對(duì)人友好,可計(jì)算機(jī)可不認(rèn)識(shí)什么變量 a,它只知道地址和指令。

所以當(dāng)你去查看 C 語(yǔ)言編譯后的匯編代碼,就會(huì)發(fā)現(xiàn)變量名消失了,取而代之的是一串串抽象的地址。

你可以認(rèn)為,編譯器會(huì)自動(dòng)維護(hù)一個(gè)映射,將我們程序中的變量名轉(zhuǎn)換為變量所對(duì)應(yīng)的地址,然后再對(duì)這個(gè)地址去進(jìn)行讀寫(xiě)。

也就是有這樣一個(gè)映射表存在,將變量名自動(dòng)轉(zhuǎn)化為地址:

a??|?0x7ffcad3b8f3c
c??|?0x7ffcad3b8f2c
h??|?0x7ffcad3b8f4c
....

說(shuō)的好!

可是我還是不知道指針存在的必要性,那么問(wèn)題來(lái)了,看下面代碼:

int?func(...)?{
??...?
};

int?main()?{
?int?a;
?func(...);
};

假設(shè)我有一個(gè)需求:

要求在func 函數(shù)里要能夠修改 main 函數(shù)里的變量 a,這下咋整,在 main 函數(shù)里可以直接通過(guò)變量名去讀寫(xiě) a 所在內(nèi)存。

但是在 func 函數(shù)里是看不見(jiàn)a 的呀。

你說(shuō)可以通過(guò)&取地址符號(hào),將 a 的地址傳遞進(jìn)去:

int?func(int?address)?{
??....
};

int?main()?{
?int?a;
?func(&a);
};

這樣在func 里就能獲取到 a 的地址,進(jìn)行讀寫(xiě)了。

理論上這是完全沒(méi)有問(wèn)題的,但是問(wèn)題在于:

編譯器該如何區(qū)分一個(gè) int 里你存的到底是 int 類(lèi)型的值,還是另外一個(gè)變量的地址(即指針)。

這如果完全靠我們編程人員去人腦記憶了,會(huì)引入復(fù)雜性,并且無(wú)法通過(guò)編譯器檢測(cè)一些語(yǔ)法錯(cuò)誤。

而通過(guò)int * 去定義一個(gè)指針變量,會(huì)非常明確:這就是另外一個(gè) int 型變量的地址。

編譯器也可以通過(guò)類(lèi)型檢查來(lái)排除一些編譯錯(cuò)誤。

這就是指針存在的必要性。

實(shí)際上任何語(yǔ)言都有這個(gè)需求,只不過(guò)很多語(yǔ)言為了安全性,給指針戴上了一層枷鎖,將指針包裝成了引用。

可能大家學(xué)習(xí)的時(shí)候都是自然而然的接受指針這個(gè)東西,但是還是希望這段啰嗦的解釋對(duì)你有一定啟發(fā)。

同時(shí),在這里提點(diǎn)小問(wèn)題:

既然指針的本質(zhì)都是變量的內(nèi)存首地址,即一個(gè) int 類(lèi)型的整數(shù)。

那為什么還要有各種類(lèi)型呢?

比如 int 指針,float 指針,這個(gè)類(lèi)型影響了指針本身存儲(chǔ)的信息嗎?

這個(gè)類(lèi)型會(huì)在什么時(shí)候發(fā)揮作用?

2.3 解引用

上面的問(wèn)題,就是為了引出指針解引用的。

pa中存儲(chǔ)的是a變量的內(nèi)存地址,那如何通過(guò)地址去獲取a的值呢?

這個(gè)操作就叫做解引用,在 C 語(yǔ)言中通過(guò)運(yùn)算符 *就可以拿到一個(gè)指針?biāo)傅刂返膬?nèi)容了。

比如*pa就能獲得a的值。

我們說(shuō)指針存儲(chǔ)的是變量?jī)?nèi)存的首地址,那編譯器怎么知道該從首地址開(kāi)始取多少個(gè)字節(jié)呢?

這就是指針類(lèi)型發(fā)揮作用的時(shí)候,編譯器會(huì)根據(jù)指針的所指元素的類(lèi)型去判斷應(yīng)該取多少個(gè)字節(jié)。

如果是 int 型的指針,那么編譯器就會(huì)產(chǎn)生提取四個(gè)字節(jié)的指令,char 則只提取一個(gè)字節(jié),以此類(lèi)推。

下面是指針內(nèi)存示意圖:

pa 指針首先是一個(gè)變量,它本身也占據(jù)一塊內(nèi)存,這塊內(nèi)存里存放的就是 a 變量的首地址。

當(dāng)解引用的時(shí)候,就會(huì)從這個(gè)首地址連續(xù)劃出 4 個(gè) byte,然后按照 int 類(lèi)型的編碼方式解釋。

2.4 活學(xué)活用

別看這個(gè)地方很簡(jiǎn)單,但卻是深刻理解指針的關(guān)鍵。

舉兩個(gè)例子來(lái)詳細(xì)說(shuō)明:

比如:

float?f?=?1.0;
short?c?=?*(short*)&f;?

你能解釋清楚上面過(guò)程,對(duì)于 f 變量,在內(nèi)存層面發(fā)生了什么變化嗎?

或者 c 的值是多少?1 ?

實(shí)際上,從內(nèi)存層面來(lái)說(shuō),f 什么都沒(méi)變。

如圖:

假設(shè)這是f 在內(nèi)存中的位模式,這個(gè)過(guò)程實(shí)際上就是把 f 的前兩個(gè) byte 取出來(lái)然后按照 short 的方式解釋?zhuān)缓筚x值給 c。

詳細(xì)過(guò)程如下:

  1. &f取得f 的首地址
  2. (short*)&f

上面第二步什么都沒(méi)做,這個(gè)表達(dá)式只是說(shuō) :

“噢,我認(rèn)為f這個(gè)地址放的是一個(gè) short 類(lèi)型的變量”

最后當(dāng)去解引用的時(shí)候*(short*)&f時(shí),編譯器會(huì)取出前面兩個(gè)字節(jié),并且按照 short 的編碼方式去解釋?zhuān)⒔忉尦龅闹蒂x給 c 變量。

這個(gè)過(guò)程 f的位模式?jīng)]有發(fā)生任何改變,變的只是解釋這些位的方式。

當(dāng)然,這里最后的值肯定不是 1,至于是什么,大家可以去真正算一下。

那反過(guò)來(lái),這樣呢?

short?c?=?1;
float?f?=?*(float*)&c;

如圖:

具體過(guò)程和上述一樣,但上面肯定不會(huì)報(bào)錯(cuò),這里卻不一定。

為什么?

(float*)&c會(huì)讓我們從c ?的首地址開(kāi)始取四個(gè)字節(jié),然后按照 float 的編碼方式去解釋。

但是c是 short 類(lèi)型只占兩個(gè)字節(jié),那肯定會(huì)訪(fǎng)問(wèn)到相鄰后面兩個(gè)字節(jié),這時(shí)候就發(fā)生了內(nèi)存訪(fǎng)問(wèn)越界。

當(dāng)然,如果只是讀,大概率是沒(méi)問(wèn)題的。

但是,有時(shí)候需要向這個(gè)區(qū)域?qū)懭胄碌闹?,比如?/p>

*(float*)&c?=?1.0;

那么就可能發(fā)生 coredump,也就是訪(fǎng)存失敗。

另外,就算是不會(huì) coredump,這種也會(huì)破壞這塊內(nèi)存原有的值,因?yàn)楹芸赡苓@是是其它變量的內(nèi)存空間,而我們?nèi)ジ采w了人家的內(nèi)容,肯定會(huì)導(dǎo)致隱藏的 bug。

如果你理解了上面這些內(nèi)容,那么使用指針一定會(huì)更加的自如。

2.6 看個(gè)小問(wèn)題

講到這里,我們來(lái)看一個(gè)問(wèn)題,這是一位群友問(wèn)的,這是他的需求:

這是他寫(xiě)的代碼:

他把 double 寫(xiě)進(jìn)文件再讀出來(lái),然后發(fā)現(xiàn)打印的值對(duì)不上。

而關(guān)鍵的地方就在于這里:

char?buffer[4];
...
printf("%f?%x\n",?*buffer,?*buffer);

他可能認(rèn)為 buffer 是一個(gè)指針(準(zhǔn)確說(shuō)是數(shù)組),對(duì)指針解引用就該拿到里面的值,而里面的值他認(rèn)為是從文件讀出來(lái)的 4 個(gè)byte,也就是之前的 float 變量。

注意,這一切都是他認(rèn)為的,實(shí)際上編譯器會(huì)認(rèn)為:

“哦,buffer 是 char類(lèi)型的指針,那我取第一個(gè)字節(jié)出來(lái)就好了”。

然后把第一個(gè)字節(jié)的值傳遞給了 printf 函數(shù),printf 函數(shù)會(huì)發(fā)現(xiàn),%f 要求接收的是一個(gè) float 浮點(diǎn)數(shù),那就會(huì)自動(dòng)把第一個(gè)字節(jié)的值轉(zhuǎn)換為一個(gè)浮點(diǎn)數(shù)打印出來(lái)。

這就是整個(gè)過(guò)程。

錯(cuò)誤關(guān)鍵就是,這個(gè)同學(xué)誤認(rèn)為,任何指針解引用都是拿到里面“我們認(rèn)為的那個(gè)值”,實(shí)際上編譯器并不知道,編譯器只會(huì)傻傻的按照指針的類(lèi)型去解釋。

所以這里改成:

printf("%f?%x\n",?*(float*)buffer,?*(float*)buffer);

相當(dāng)于明確的告訴編譯器:

buffer指向的這個(gè)地方,我放的是一個(gè) float,你給我按照 float 去解釋”

三、 結(jié)構(gòu)體和指針

結(jié)構(gòu)體內(nèi)包含多個(gè)成員,這些成員之間在內(nèi)存中是如何存放的呢?

比如:

struct?fraction?{
?int?num;?//?整數(shù)部分
?int?denom;?//?小數(shù)部分
};

struct?fraction?fp;
fp.num?=?10;
fp.denom?=?2;

這是一個(gè)定點(diǎn)小數(shù)結(jié)構(gòu)體,它在內(nèi)存占 8 個(gè)字節(jié)(這里不考慮內(nèi)存對(duì)齊),兩個(gè)成員域是這樣存儲(chǔ)的:

image-20201030214416842

我們把 10 放在了結(jié)構(gòu)體中基地址偏移為 0 的域,2 放在了偏移為 4 的域。

接下來(lái)我們做一個(gè)正常人永遠(yuǎn)不會(huì)做的操作:

((fraction*)(&fp.denom))->num?=?5;?
((fraction*)(&fp.denom))->denom?=?12;?
printf("%d\n",?fp.denom);?//?輸出多少?

上面這個(gè)究竟會(huì)輸出多少呢?自己先思考下噢~

接下來(lái)我分析下這個(gè)過(guò)程發(fā)生了什么:

首先,&fp.denom表示取結(jié)構(gòu)體 fp 中 denom 域的首地址,然后以這個(gè)地址為起始地址取 8 個(gè)字節(jié),并且將它們看做一個(gè) fraction 結(jié)構(gòu)體。

在這個(gè)新結(jié)構(gòu)體中,最上面四個(gè)字節(jié)變成了 denom 域,而 fp 的 denom 域相當(dāng)于新結(jié)構(gòu)體的 num 域。

因此:

((fraction*)(&fp.denom))->num = 5

實(shí)際上改變的是 fp.denom,而

((fraction*)(&fp.denom))->denom = 12

則是將最上面四個(gè)字節(jié)賦值為 12。

當(dāng)然,往那四字節(jié)內(nèi)存寫(xiě)入值,結(jié)果是無(wú)法預(yù)測(cè)的,可能會(huì)造成程序崩潰,因?yàn)橐苍S那里恰好存儲(chǔ)著函數(shù)調(diào)用棧幀的關(guān)鍵信息,也可能那里沒(méi)有寫(xiě)入權(quán)限。

大家初學(xué) C 語(yǔ)言的很多 coredump 錯(cuò)誤都是類(lèi)似原因造成的。

所以最后輸出的是 5。

為什么要講這種看起來(lái)莫名其妙的代碼?

就是為了說(shuō)明結(jié)構(gòu)體的本質(zhì)其實(shí)就是一堆的變量打包放在一起,而訪(fǎng)問(wèn)結(jié)構(gòu)體中的域,就是通過(guò)結(jié)構(gòu)體的起始地址,也叫基地址,然后加上域的偏移。

其實(shí),C++、Java 中的對(duì)象也是這樣存儲(chǔ)的,無(wú)非是他們?yōu)榱藢?shí)現(xiàn)某些面向?qū)ο蟮奶匦?,?huì)在數(shù)據(jù)成員以外,添加一些 Head 信息,比如C++ 的虛函數(shù)表。

實(shí)際上,我們是完全可以用 C 語(yǔ)言去模仿的。

這就是為什么一直說(shuō) C 語(yǔ)言是基礎(chǔ),你真正懂了 C 指針和內(nèi)存,對(duì)于其它語(yǔ)言你也會(huì)很快的理解其對(duì)象模型以及內(nèi)存布局。

四、多級(jí)指針

說(shuō)起多級(jí)指針這個(gè)東西,我以前大一,最多理解到 2 級(jí),再多真的會(huì)把我繞暈,經(jīng)常也會(huì)寫(xiě)錯(cuò)代碼。

你要是給我寫(xiě)個(gè)這個(gè):int ******p 能把我搞崩潰,我估計(jì)很多同學(xué)現(xiàn)在就是這種情況?

其實(shí),多級(jí)指針也沒(méi)那么復(fù)雜,就是指針的指針的指針的指針......非常簡(jiǎn)單。

今天就帶大家認(rèn)識(shí)一下多級(jí)指針的本質(zhì)。

首先,我要說(shuō)一句話(huà),沒(méi)有多級(jí)指針這種東西,指針就是指針,多級(jí)指針只是為了我們方便表達(dá)而取的邏輯概念。

首先看下生活中的快遞柜:

這種大家都用過(guò)吧,豐巢或者超市儲(chǔ)物柜都是這樣,每個(gè)格子都有一個(gè)編號(hào),我們只需要拿到編號(hào),然后就能找到對(duì)應(yīng)的格子,取出里面的東西。

這里的格子就是內(nèi)存單元,編號(hào)就是地址,格子里放的東西就對(duì)應(yīng)存儲(chǔ)在內(nèi)存中的內(nèi)容。

假設(shè)我把一本書(shū),放在了 03 號(hào)格子,然后把 03 這個(gè)編號(hào)告訴你,你就可以根據(jù) 03 去取到里面的書(shū)。

那如果我把書(shū)放在 05 號(hào)格子,然后在 03 號(hào)格子只放一個(gè)小紙條,上面寫(xiě)著:「書(shū)放在 05 號(hào)」。

你會(huì)怎么做?

當(dāng)然是打開(kāi) 03 號(hào)格子,然后取出了紙條,根據(jù)上面內(nèi)容去打開(kāi) 05 號(hào)格子得到書(shū)。

這里的 03 號(hào)格子就叫指針,因?yàn)樗锩娣诺氖侵赶蚱渌褡拥男〖垪l(地址)而不是具體的書(shū)。

明白了嗎?

那我如果把書(shū)放在 07 號(hào)格子,然后在 05 號(hào)格子 放一個(gè)紙條:「書(shū)放在 07號(hào)」,同時(shí)在03號(hào)格子放一個(gè)紙條「書(shū)放在 05號(hào)」

這里的 03 號(hào)格子就叫二級(jí)指針,05 號(hào)格子就叫指針,而 07 號(hào)就是我們平常用的變量。

依次,可類(lèi)推出 N 級(jí)指針。

所以你明白了嗎?同樣的一塊內(nèi)存,如果存放的是別的變量的地址,那么就叫指針,存放的是實(shí)際內(nèi)容,就叫變量。

int?a;
int?*pa?=?&a;
int?**ppa?=?&pa;
int?***pppa?=?&ppa;

上面這段代碼,pa就叫一級(jí)指針,也就是平時(shí)常說(shuō)的指針,ppa 就是二級(jí)指針。

內(nèi)存示意圖如下:

不管幾級(jí)指針有兩個(gè)最核心的東西:

  • 指針本身也是一個(gè)變量,需要內(nèi)存去存儲(chǔ),指針也有自己的地址
  • 指針內(nèi)存存儲(chǔ)的是它所指向變量的地址

這就是我為什么多級(jí)指針是邏輯上的概念,實(shí)際上一塊內(nèi)存要么放實(shí)際內(nèi)容,要么放其它變量地址,就這么簡(jiǎn)單。

怎么去解讀int **a這種表達(dá)呢?

int ** a 可以把它分為兩部分看,即int**a,后面 *a 中的*表示 a 是一個(gè)指針變量,前面的 int* 表示指針變量a

只能存放 int* 型變量的地址。

對(duì)于二級(jí)指針甚至多級(jí)指針,我們都可以把它拆成兩部分。

首先不管是多少級(jí)的指針變量,它首先是一個(gè)指針變量,指針變量就是一個(gè)*,其余的*表示的是這個(gè)指針變量只能存放什么類(lèi)型變量的地址。

比如int****a表示指針變量 a 只能存放int*** 型變量的地址。

五、指針與數(shù)組

5.1 一維數(shù)組

數(shù)組是 C 自帶的基本數(shù)據(jù)結(jié)構(gòu),徹底理解數(shù)組及其用法是開(kāi)發(fā)高效應(yīng)用程序的基礎(chǔ)。

數(shù)組和指針表示法緊密關(guān)聯(lián),在合適的上下文中可以互換。

如下:

int?array[10]?=?{10,?9,?8,?7};
printf("%d\n",?*array);??//??輸出?10
printf("%d\n",?array[0]);??//?輸出?10

printf("%d\n",?array[1]);??//?輸出?9
printf("%d\n",?*(array+1));?//?輸出?9

int?*pa?=?array;
printf("%d\n",?*pa);??//??輸出?10
printf("%d\n",?pa[0]);??//?輸出?10

printf("%d\n",?pa[1]);??//?輸出?9
printf("%d\n",?*(pa+1));?//?輸出?9

在內(nèi)存中,數(shù)組是一塊連續(xù)的內(nèi)存空間:

第 0 個(gè)元素的地址稱(chēng)為數(shù)組的首地址,數(shù)組名實(shí)際就是指向數(shù)組首地址,當(dāng)我們通過(guò)array[1]或者*(array + 1) 去訪(fǎng)問(wèn)數(shù)組元素的時(shí)候。

實(shí)際上可以看做 address[offset],address 為起始地址,offset 為偏移量,但是注意這里的偏移量offset 不是直接和 address相加,而是要乘以數(shù)組類(lèi)型所占字節(jié)數(shù),也就是: address + sizeof(int) * offset

學(xué)過(guò)匯編的同學(xué),一定對(duì)這種方式不陌生,這是匯編中尋址方式的一種:基址變址尋址。

看完上面的代碼,很多同學(xué)可能會(huì)認(rèn)為指針和數(shù)組完全一致,可以互換,這是完全錯(cuò)誤的。

盡管數(shù)組名字有時(shí)候可以當(dāng)做指針來(lái)用,但數(shù)組的名字不是指針。

最典型的地方就是在 sizeof:

printf("%u",?sizeof(array));
printf("%u",?sizeof(pa));

第一個(gè)將會(huì)輸出 40,因?yàn)?array包含有 10 個(gè)int類(lèi)型的元素,而第二個(gè)在 32 位機(jī)器上將會(huì)輸出 4,也就是指針的長(zhǎng)度。

為什么會(huì)這樣呢?

站在編譯器的角度講,變量名、數(shù)組名都是一種符號(hào),它們都是有類(lèi)型的,它們最終都要和數(shù)據(jù)綁定起來(lái)。

變量名用來(lái)指代一份數(shù)據(jù),數(shù)組名用來(lái)指代一組數(shù)據(jù)(數(shù)據(jù)集合),它們都是有類(lèi)型的,以便推斷出所指代的數(shù)據(jù)的長(zhǎng)度。

對(duì),數(shù)組也有類(lèi)型,我們可以將 int、float、char 等理解為基本類(lèi)型,將數(shù)組理解為由基本類(lèi)型派生得到的稍微復(fù)雜一些的類(lèi)型,

數(shù)組的類(lèi)型由元素的類(lèi)型和數(shù)組的長(zhǎng)度共同構(gòu)成。而 sizeof 就是根據(jù)變量的類(lèi)型來(lái)計(jì)算長(zhǎng)度的,并且計(jì)算的過(guò)程是在編譯期,而不會(huì)在程序運(yùn)行時(shí)。

編譯器在編譯過(guò)程中會(huì)創(chuàng)建一張專(zhuān)門(mén)的表格用來(lái)保存變量名及其對(duì)應(yīng)的數(shù)據(jù)類(lèi)型、地址、作用域等信息。

sizeof 是一個(gè)操作符,不是函數(shù),使用 sizeof 時(shí)可以從這張表格中查詢(xún)到符號(hào)的長(zhǎng)度。

所以,這里對(duì)數(shù)組名使用sizeof可以查詢(xún)到數(shù)組實(shí)際的長(zhǎng)度。

pa 僅僅是一個(gè)指向 int 類(lèi)型的指針,編譯器根本不知道它指向的是一個(gè)整數(shù),還是一堆整數(shù)。

雖然在這里它指向的是一個(gè)數(shù)組,但數(shù)組也只是一塊連續(xù)的內(nèi)存,沒(méi)有開(kāi)始和結(jié)束標(biāo)志,也沒(méi)有額外的信息來(lái)記錄數(shù)組到底多長(zhǎng)。

所以對(duì) pa 使用 sizeof 只能求得的是指針變量本身的長(zhǎng)度。

也就是說(shuō),編譯器并沒(méi)有把 pa 和數(shù)組關(guān)聯(lián)起來(lái),pa 僅僅是一個(gè)指針變量,不管它指向哪里,sizeof求得的永遠(yuǎn)是它本身所占用的字節(jié)數(shù)。

5.2 ?二維數(shù)組

大家不要認(rèn)為二維數(shù)組在內(nèi)存中就是按行、列這樣二維存儲(chǔ)的,實(shí)際上,不管二維、三維數(shù)組... 都是編譯器的語(yǔ)法糖。

存儲(chǔ)上和一維數(shù)組沒(méi)有本質(zhì)區(qū)別,舉個(gè)例子:

int?array[3][3]?=?{{1,?2,3},?{4,?5,6},{7,?8,?9}};
array[1][1]?=?5;

或許你以為在內(nèi)存中 array 數(shù)組會(huì)像一個(gè)二維矩陣:

1??2??3
4??5??6
7??8??9

可實(shí)際上它是這樣的:

1??2??3??4??5??6??7??8??9

和一維數(shù)組沒(méi)有什么區(qū)別,都是一維線(xiàn)性排列。

當(dāng)我們像 array[1][1]這樣去訪(fǎng)問(wèn)的時(shí)候,編譯器會(huì)怎么去計(jì)算我們真正所訪(fǎng)問(wèn)元素的地址呢?

為了更加通用化,假設(shè)數(shù)組定義是這樣的:

int array[n][m]

訪(fǎng)問(wèn): array[a][b]

那么被訪(fǎng)問(wèn)元素地址的計(jì)算方式就是: array + (m * a + b)

這個(gè)就是二維數(shù)組在內(nèi)存中的本質(zhì),其實(shí)和一維數(shù)組是一樣的,只是語(yǔ)法糖包裝成一個(gè)二維的樣子。

六、神奇的 void 指針

想必大家一定看到過(guò) void 的這些用法:

void?func();
int?func1(void);

在這些情況下,void 表達(dá)的意思就是沒(méi)有返回值或者參數(shù)為空。

但是對(duì)于 void 型指針卻表示通用指針,可以用來(lái)存放任何數(shù)據(jù)類(lèi)型的引用。

下面的例子就 是一個(gè) void 指針:

void?*ptr;

void 指針最大的用處就是在 C 語(yǔ)言中實(shí)現(xiàn)泛型編程,因?yàn)槿魏沃羔樁伎梢员毁x給 void 指針,void 指針也可以被轉(zhuǎn)換回原來(lái)的指針類(lèi)型, 并且這個(gè)過(guò)程指針實(shí)際所指向的地址并不會(huì)發(fā)生變化。

比如:

int?num;
int?*pi?=?#?
printf("address?of?pi:?%p\n",?pi);
void*?pv?=?pi;
pi?=?(int*)?pv;?
printf("address?of?pi:?%p\n",?pi);

這兩次輸出的值都會(huì)是一樣:

平常可能很少會(huì)這樣去轉(zhuǎn)換,但是當(dāng)你用 C 寫(xiě)大型軟件或者寫(xiě)一些通用庫(kù)的時(shí)候,一定離不開(kāi) void 指針,這是 C 泛型的基石,比如 std 庫(kù)里的 sort 函數(shù)申明是這樣的:

void?qsort(void?*base,int?nelem,int?width,int?(*fcmp)(const?void?*,const?void?*));

所有關(guān)于具體元素類(lèi)型的地方全部用 void 代替。

void 還可以用來(lái)實(shí)現(xiàn) C 語(yǔ)言中的多態(tài),這是一個(gè)挺好玩的東西。

不過(guò)也有需要注意的:

  • 不能對(duì) void 指針解引用

比如:

int?num;
void?*pv?=?(void*)#
*pv?=?4;?//?錯(cuò)誤

為什么?

因?yàn)榻庖玫谋举|(zhì)就是編譯器根據(jù)指針?biāo)傅念?lèi)型,然后從指針?biāo)赶虻膬?nèi)存連續(xù)取 N 個(gè)字節(jié),然后將這 N 個(gè)字節(jié)按照指針的類(lèi)型去解釋。

比如 int *型指針,那么這里 N 就是 4,然后按照 int 的編碼方式去解釋數(shù)字。

但是 void,編譯器是不知道它到底指向的是 int、double、或者是一個(gè)結(jié)構(gòu)體,所以編譯器沒(méi)法對(duì) void 型指針解引用。

七、花式秀技

很多同學(xué)認(rèn)為 C 就只能面向過(guò)程編程,實(shí)際上利用指針和結(jié)構(gòu)體,我們一樣可以在 C 中模擬出對(duì)象、繼承、多態(tài)等東西。

也可以利用 void 指針實(shí)現(xiàn)泛型編程,也就是 Java、C++ 中的模板。

大家如果對(duì) C 實(shí)現(xiàn)面向?qū)ο蟆⒛0?、繼承這些感興趣的話(huà),可以積極一點(diǎn),點(diǎn)贊,留言~ ?呼聲高的話(huà),我就再寫(xiě)一篇。

實(shí)際上也是很有趣的東西,當(dāng)你知道了如何用 C 去實(shí)現(xiàn)這些東西,那你對(duì) C++ 中的對(duì)象、Java 中的對(duì)象也會(huì)理解得更加透徹。

比如為啥有 this 指針,或者 Python 中的 self 究竟是個(gè)啥?

關(guān)于指針想寫(xiě)的內(nèi)容還有很多,這其實(shí)也只算是開(kāi)了個(gè)頭,限于篇幅,以后有機(jī)會(huì)補(bǔ)齊以下內(nèi)容:

  • 二維數(shù)組和二維指針
  • 數(shù)組指針和指針數(shù)組
  • 指針運(yùn)算
  • 函數(shù)指針
  • 動(dòng)態(tài)內(nèi)存分配: malloc 和 free
  • 堆、棧
  • 函數(shù)參數(shù)傳遞方式
  • 內(nèi)存泄露
  • 數(shù)組退化成指針
  • const 修飾指針
  • ...
基本上涵蓋了 C 語(yǔ)言最核心的知識(shí)。

來(lái)個(gè)直擊靈魂的三連吧!


瀏覽 32
點(diǎn)贊
評(píng)論
收藏
分享

手機(jī)掃一掃分享

分享
舉報(bào)
評(píng)論
圖片
表情
推薦
點(diǎn)贊
評(píng)論
收藏
分享

手機(jī)掃一掃分享

分享
舉報(bào)

感谢您访问我们的网站,您可能还对以下资源感兴趣:

国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频 老熟女导航| 欧美在线一区二区三区| 亚洲日韩精品在线观看| 婷婷久热| 国产精品毛片A√一区| 久久成人免费| 大肉大捧一出免费观看| 成人av免费观看| 欧美成人午夜影院| 国产高清秘成人久久| 波多野结衣视频在线| 亚洲色,天堂网| 久久成人久久爱| 日韩黄色中文字幕| 国产a视频| 五月开心激情网| 91香蕉视频免费在线观看| 欧美一级A片在免费看| 国产色黄视频| 97人人操| 男女操网站| 日韩射| 黄片网址大全| 深爱开心激情| 99久久爱re热6在播放| 日韩欧美网站| 自拍av在线| 人人操人人操人人操人人| 国产真实乱婬A片久久久老牛| 亚洲成人在线视频观看| 国产日韩欧美在线| 日本色色| 午夜福利在线视频| 日韩欧美手机在线| 激情无码一区二区三区| 天天干天天肏| 亚洲中文字幕免费观看视频| 亚洲AⅤ欧美AⅤ| 欧美日韩国产精品| 黄色影片在线观看| 国产v视频| 大香蕉国产在线视频| 俺去也在线播放| 欧美精品一区二区三区蜜臀 | 色老板免费精品无码免费视频| 成人视频网站在线观看| 色猫av| 欧美va| 翔田千里无码破解| 安徽妇搡BBBB搡BBBB按摩| 久久久久亚洲精品| 亚洲欧美成人片| 九九性视频| 伊人久久综合| 高清无码在线看| 91精品国产综合久久久蜜臀九色| 久久99久久99精品免视看婷婷| 国产区欧美去区在线| 可以免费观看的毛片| 三级片AV在线| 苍井空精毛片精品久久久| 精品国产乱子伦一区二区三区,小小扐| 久久久久99精品成人片欧美一区| 国产午夜无码福利视频| 黄片二区| 大香蕉av在线观看| 日韩激情AV| 日产精品久久久久| 人妻精品无码| 欧美黄片一区二区| 少妇搡BBBB搡BBB搡小说 | 九九性爱视频| 国产成人一级片| 亚洲精品久久久蜜桃| 超碰婷婷| 国产av黄| 国产一区在线看| 91爱搞在线| 日逼高清无码| 国产精品一区一区三区| 亚洲影院第一页| 色一本| 天天躁狠狠躁夜躁2024| h片在线免费观看| www.欧美| 久久久毛片| 九色PORNY自拍视频| 精品区| 成人亚洲视频| 夜夜撸网站| 日韩欧美国产成人| 狠狠躁18三区二区一区免费人| a免费在线观看| 日本电影一区二区三区| 青娱乐| 蜜桃Av噜噜一区二区三区四区| 日韩成人AV电影| 精品秘一区性综合三区| 免费无码国产在线怀| 怡红院麻豆| 2025天天操夜夜操| 久久久www成人免费毛片| 精品福利一区二区三区| 91人妻人人澡人人爽人人精吕| 日韩视频免费观看高清完整版在线观 | 激情开心五月天| 国内老熟妇对白HDXXXX| 精品午夜福利| 日韩va中文字幕无码免费| 国产学生妹在线播放| 成人欧美视频| 成人在线免费网站| 亚洲中文娱乐| 一区二区三区中文字幕| 操片免费| 免费毛片网| 91中文字幕+乱码| 日本特级片| AV资源在线播放| 91啪啪视频| 北条麻妃高清无码| 波多野结衣亚洲无码| 91色婷婷综合久久中文字幕二区| 一区二区三区四区免费| 四虎成人网站| 操b在线| 午夜激情视频| 伊人大香蕉在线视频| 五月婷婷影院| 不卡一区| 老师机性爱视频在线播放| 欧美伊人网在线观看| 欧洲成人在线播放| 成人手机AV| 四虎色情| 一级视频免费观看| 韩国成人免费无码免费视频| 亚洲日本无码50p| 懂色av懂色av粉嫩av| 国产成人视频免费在线观看| 老熟女伦一区二区三区| 色吧| 亚洲视频高清无码| 亚洲最大视频| 一级a一级a爱片免费视频| 亚洲日韩Av无码中文字幕美国| 加勒比色综合| 欧美色图第一页| 天天操天天日天天干| 特黄视频| 韩国三级中文字幕HD久久精品| 色欲天天网| 内射学生妹J亅| 7777精品伊人久久7777| 俺来也俺去也www色官| 国产精品你懂得| 久久偷拍网| 亚洲成年人在线| 国产亚洲99久久精品熟女| 欧美日韩亚洲一区二区| 丁香五月婷婷啪啪| 黑巨茎大战欧美白妞小说| 亚洲中文字幕高清| 日韩免费A片| 一本色道久久加勒比精品| 青娱乐精品视频| 大色欧美综合| 少妇搡BBBB搡BBB搡毛片| 中文色片| 激情综合在线| 99久久99久久精品免费看小说。| 国产成人免费在线观看| 爱爱毛片| 一区二区三区无码视频| 天天天日天天天操| 国产a毛一级,a毛一级| 日本豆花视频| 波多野吉衣高清无码| 亚洲AV性爱| 狠狠躁夜夜躁人爽| 男女午夜福利| 欧美视频一区| 国产一级性爱视频| 97精品超碰一区二区三区| 91丨国产丨白浆| 自拍偷拍一区二区| 日韩中文在线视频| 操逼一级片| 五月婷婷中文字幕| 青娱在线视频| av手机天堂网| 久久蜜桃视频| 日韩一卡二卡| 日本大香蕉视频| 人人摸人人摸| 一区二区高清无码视频| 久操麻豆| 麻豆传媒一区二区| 口爆吞精在线| 天天干,夜夜操| 北条麻妃一区二区三区-免费免费高清观看| 日韩精品一区二区三免费视频 | 亚洲白浆| 亚洲AV偷拍| 最好看的MV中文字幕国语| 国产视频导航| 中文字幕有码在线播放| 九九九九九九精品视频| 欧美亚洲日韩一区二区| 亚洲字幕无码| 99久久视频| 91亚洲精品久久久久蜜桃| 亚洲一区二区三区免费视频| 日本一级黄| 久久精品毛片| 欧美成人大香蕉| 欧美色小说| 午夜AV免费| 国产成人秘在线观看免费网站| 91亚洲国产成人久久精品麻豆| 国精产品一二四区黑人| 亚洲天天操| 91人妻人人澡人人爽人人精吕| 91天天在线| 亚洲天堂视频在线播放| 青青草在线播放| 苍井空一区| 激情无码网站| www.豆花社区成人| 猫咪AV大香蕉| 国产一区二区三区免费播放| 伊人免费视频| 亚洲国产精| 日逼黄色视频| 亚洲无码精品一区二区| 77777色婷婷| 黄色毛片av| 日韩在线二区| 国产AV日韩AV| 天天撸视频| JlZZJLZZJlZZ亚洲女人17| 日韩一区二区无码视频| 一区二区无码免费| 精品国产99| 色狠狠网| 亚洲无码三级视频| 亚洲色综合久久五月| 91亚洲电影| 成人无码视频在线| 在线中文字幕亚洲| 巜痴漢電車~凌脔版2| 欧美日韩成人电影| 精品色片| 欧美成人福利在线观看| 精品人妻二区中文字幕| 无码视频在线播放| 国产91在线拍揄自揄拍无码九色| 毛片黄色视频| 91在线无码精品秘入口动作| 欧美亚洲国产精品| 丰滿人妻一区二区三| 免费91视频| 人妻大香蕉| 最新毛片网站〖网:.〗| 2014av天堂网| 五月婷婷六月激情| 逼特逼视频网站| 91亚洲国产成人久久精品网站| 国产在线拍偷自揄拍无码一区二区| 日韩在线免费| 亚洲色成人中文字幕在线| 中文字幕在线中文| 一起操在线| 一级黄色录相片| 亚洲免费黄色片| 午夜无码人妻AV大片| 一本一道久久综合狠狠躁牛牛影视| 特黄特色一级特黄大片| 天堂网在线观看| 人人艹人人摸| 久久A√一区二区| 夫妻-ThePorn| 日韩午夜精品| 暴操美女网站| 日韩欧美黄| 99免费在线观看| 性做久久久久久| 欧美在线视频网| 九九九成人网| 熟女456| 在线亚洲欧洲| 国产在线拍揄自揄拍无码福利| a在线观看免费| 一级黄色免费片| 亚洲一页| 狠操网| 国产内射网站| 狠狠操av| 黄一区二区| 天天色色色| 狠狠狠狠狠| 中文字幕东京热| 爱爱成人视频| 详情:绿帽夫妻多人运动开淫啪-91n| 日韩一级片在线| 91人妻人人澡人人| 欧美性极品少妇精品网站| 国产aaaaaa| 荫蒂添出高潮A片视频| 日本无码片| 午夜AV在线免费观看| 无码精品视频| 先锋资源日韩| 男人天堂色男人| 成人视频123| 黄色毛片在线| 五月丁香中文字幕| 亚洲无码另类| 男人午夜天堂| 国产一区二区做爱| 激情爱爱网站| 东京热这里只有精品| a在线| 国产在线无码观看| 翔田千里被操120分钟| 日本黄色高清视频| 免费看A| 大香蕉尹人在线视频| 狠狠躁18三区二区一区免费人| 亚洲欧美综合| 91无码人妻精品1国产四虎| 国产精品美女毛片真酒店| 亚洲成人AV一区二区| 91成人无码看片在线观看网址 | 成人午夜在线观看| 爽好紧别夹喷水欧美| 一区二区三区在线视频观看| 成人午夜视频在线观看| 一级a在线| 国产乱子伦-区二区三区四区| 永井玛丽亚av无码中出流出| 亚洲日韩在线中文字幕| 免费国产黄色| 国产乱子伦一区二区三| 性猛交AAAA片免费看蜜桃视频| 五月天亚洲无码| 欧美成人免费电影| 国色天香一区二区| 欧美三级网站在线观看| 狠狠综合| 一级黄色视频免费观看| 黄色一级大片| 日韩精品视频免费在线观看| 黄色小电影网站| 高圆圆一区二区三区| 久久大| 久久午夜成人电影| 国产在线视频一区| 欧美亚洲成人网站| 久操视频在线观看免费| 青青青在线| 亚洲av网址| 男女嫩草视频| 日韩免费黄色视频| 日韩免费高清| 精品国产久久久久久| 影音先锋一区二区| 特黄在线| 国产无码免费视频| 欧美后门菊门交3p、| 91你懂的| 国产白丝精品91爽爽久久| 成人黄色毛片| 欧美aaa在线| 韩日在线| 深夜福利一区二区| 日韩高清AV| 老司机午夜视频| 久久免费观看视频| 日韩一区二区三区无码电影| 91精品久久久久| 北条麻妃91人妻互换| 91成人影片| 国产高清无码一区| 人妻人人爽| 91亚洲精品国偷拍自产在线观看 | 国产在线a| 国产欧美综合三级伦| 成人AV免费在线观看| 黄色综合网站| 亚洲综合免费观看| 国产在线97| 欧美四区| 91亚洲精品国偷拍自产在线观看 | 黄色成人在线视频| 成年人黄色在线观看| 中国操逼网| 中文字幕五码| 国产激情无码| 视色视频在线观看18| 日韩视频播放在线综合| 天堂一区二区三区18| 亚洲人在线观看| 丝袜一区| 亚洲日韩成人AV| 91美女网站| 色老板综合| 人妻无码免费视频| 一级少女免费播放电视剧韩剧TV | 综合天堂AV久久久久久久| 欧美性猛交XXXXⅩXX| 男女日逼视频| 日韩精品免费在线观看| 大香蕉大香蕉大香蕉| 欧美插逼视频| AV中文字幕电影| 先锋影音AV资源网| 成年人黄色在线观看| 樱桃码一区二区三区| 国产精品99视频| a亚洲天堂| 黄色视频小说| 亚洲在线观看网站| 九色PORNY自拍视频| 岛国电影av| 色交视频| 国产丝袜在线视频| 北条麻妃视频在线播放| 色五月天婷婷| 国产a片免费观看| 安徽妇搡BBBB搡BBBB按摩小说| 国产精品视频在线免费观看 | 影音先锋久久| 天天日天天摸| 天天日夜夜撸| 欧美成人a片| 亚洲天堂在线视频播放| 欧美操操操| 北条麻妃中文字幕在线观看| 97人人操人人干| 在线a视频| 成人黄网站免费视频| 日本成人性爱视频网站一区| 91秦先生在线播放| 日韩一区二区在线看在线看| 18XXX亚洲HD护士JD| 久久精品在线播放| www99国产| 五月天社区| 丁香五月婷婷基地| 新亚洲天堂男子Av-| 中文字幕第315页| 婷婷丁香花| 五月天婷婷色| 密臀久久| 91精品国产乱码久久久| 中文字幕日韩有码| 91丨九色丨国产在线| 国产免费操逼| 国产图区| 欧美日韩一区视频| 久久国产热在8| 午夜福利成人视频| 国产黄片一区二区| 翔田千里无码在线观看| 蜜桃av色偷偷av老熟女| 午夜8050| 精品无码免费看专区| 欧美日本国产| 欧美激情精品| 伊人春色网| 国模私拍视频| 羽月希奶水饱胀在线播放| 翔田千里与黑人50分钟| 国产黄| 亚洲欧美成人视频| 欧美黄片AAA| 日本黄网站| 成人网站欧美| 人人摸人人操人人爽| 久热精品视频在线观看| 西西人体44www大胆无码| 先锋久久资源| 天天综合91| 亚洲黄色免费| 人人摸人人看人人| 狠狠综合| HEZ-502搭讪绝品人妻系列| 亚洲免费黄色片| 九九久久国产精品| 91成人精品视频| 日韩不卡AV| 久热精品在线| 成人无码精品| 大香蕉伊人网站| 日韩无码1| 天天操天天干欧美精品| 日韩色网站| 日本操B视频| 久久你懂的| 99re这里只有| 青娱乐自拍偷拍| 啪啪免费网| 国产美女操逼网站| 久久久精品国产| 一区二区无码高清| 免费色色网站| 日本成人中文字幕在线观看| 蜜芽av在线| 欧美av| 久久国产日韩| 日韩东京热中文字幕| 色哟哟国产精品| 免费看操逼逼| 亚洲欧洲自拍| 日韩一级片在线观看| 成人AV中文解说水果派| 国产在线高清| 天天操人人爽| 欧美高清在线综合| 国产精品永久免费| 色视频在线观看免费| 大地资源中文第二页导读内容| 青青超碰| 特级西西444WWW高清| 欧美日韩国产在线| 久久精品亚洲| 欧美性猛交XXXX乱大交蜜桃 | 国内老熟妇对白HDXXXX| 人人爽人人操人人| av天堂小说网| 久操无码视频| 亚洲免费三级片| 美女白嫩嫩大BBB欣赏| 91无码人妻精品1国产四虎| 中文无码高清在线| 强开小嫩苞一区二区三区视频| 中文字幕精品在线观看| 91久久精品无码一区| 亚洲综合网在线观看| 日韩免费福利视频| 久草这里只有精品| 苍井空一区二区三区| 亚洲色图网站| 狠狠撸综合| 成人做爰免费网站2023| 中文字幕亞洲高清手機版第617 | 日本AV在线播放| 成人国产在线无码AV免费| 欧美国产操逼| 久久影院三级片| 久久大香蕉视频| 久久久999久久久999精神| 97精品在线观看| 成人免费黄色网| 92自拍视频| 久久午夜无码鲁片午夜精品男男| 最近中文字幕免费| 精品久久ai| 亚洲一区二区在线播放| 91免费成人视频| 在线观看毛片网站| 伊人在线观看视频| 特级西西WWW444人体聚色| 精品欧美乱码久久久久久| 91麻花| AV观看免费| 国产一级婬片A片免费妖精视频| 五月激情综合网| 91精品久久久久久粉嫩| 午夜成人福利剧场| 国产香蕉视频在线播放| 一级a一级a爱片兔兔软件| 婷婷丁香五月激情一区综合网| 欧洲一级片| 色欲av伊人久久大香线蕉影院| 久久久久麻豆V国产精华液好用吗 色噜噜狠狠一区二区三区牛牛影视 | 四虎成人免费视频| 成人黄网站免费视频| 开心五月色婷婷综合开心网| 免费的黄色A片| 色墦五月丁香| 深夜无码| 国产综合av| 中文无码字幕在线| 欧美在线视频网| 先锋AV资源站| 黄色视频网站亚洲| 97无码免费| 亚洲色情视频| 色婷| 大荫蒂hd大荫蒂视频| 丁香婷婷激情五月| 91麻花| 综合网操笔| 俺也来俺也去WWW色| 龙泽美曦土豪| 日韩免费AV| 日日夜夜精品视频| 男男做受A片AAAA| 又大又黄又爽| 国产成人精品av在线观看| 婷婷五月天色综合| 骚BBBB槡BBB槡BBB| 99热精品久久| 香蕉国产AV| 亚洲精品乱码久久久久| 青青草原AV| 亚洲香蕉| 欧美亚洲日韩中文字幕| JlZZJLZZ亚洲美女18| 在线看亚洲| 青青草原在线视频免费观看| 欧美特级黄| 日韩天堂在线播放| 亚洲成人在线视频观看| 艾操网| 欧美日韩在线观看视频| 水果派AV解说| 黄片久久| 亚洲无码中文字幕在线播放| 国产福利一区二区| 在线观看日韩AV| 亚洲精品中文字幕乱码三区91 | 成人网站在线| 中文字幕在线观看一区| 大鸡吧在线观看| 东京热视频网| 视色av| 九色PORNY蝌蚪视频| 中文字幕你懂的| 天天日狠狠操| a片一级片| 午夜亚洲精品| 亚洲成人精品AV| 啪啪网站免费看| 婷婷色色五月| 国模无码在线| 麻豆传媒av| 精产国品一区二区| 日韩99在线观看| 天天色免费视频| 91日韩在线| 日韩无码人妻| 无码熟妇| 婷婷五月天电影| 2017人人操| 白浆av| 日韩免费网站| 在线观看黄色AV| 九九精品国产| 粉嫩小泬BBBBBB免费| 欧美人妻精品| 日韩啪| 2025精品视频| 99ri精品| 翔田千里無碼破解| 日本天天操| 日韩欧美一级视频| 欧美日韩亚洲中文字幕| 91av免费在线观看| 国产精品第二页| 在线播放内射| 欧美AⅤ在线| 91视频在| 少妇激情av| 不卡日韩| 国产高清A片| 亚洲一级视频在线观看| AV福利在线| 亚洲在线一区| 亚洲日韩欧美一区二区天天天| 日本中文在线观看| 欧美精品在线观看视频| 日韩在线视频一区二区三区| 在线观看亚洲专区| A一级黄色片| 在线免费观看亚洲| 黄片免费播放| 欧美色视频在线观看| 日韩在线精品视频| 日韩性爱视频网站| 日韩高清一级| 日逼黄色| 国产av黄色| 欧美另类视频| 午夜福利片| 中文字幕伊人| 樱桃码一区二区三区| 国产激情久久| 欧美婷婷| 最美孕交vivoestv另类| 人人操人人干人人操| 欧美久久电影| 天堂无码视频在线播放| 韩日成人| 五月丁香婷中文字幕| 91人妻人人澡人人爽人人DVD| 91大鸡| 午夜免费小视频| 日本视频精品| 人人干人人上| 日韩中文字幕免费在线观看| 再深点好爽灬轻点久久国产| 日韩性爱小视频| 一区二区三区精品视频| 精品无码电影| 国产成人精品三级麻豆| 成人黄片网站| a视频在线观看| 神马午夜精品95| 伊人在综合| 加勒比日韩无码| A免费观看| 影音先锋91| 无码电影在线播放| 开心激情婷婷| 久久99久久99| 午夜黄色小视频| 夜夜爽天天爽| 最新av在线| 国产综合久久| 欧美三级视频| 伊人AV在线| 我要操视频| 少妇人妻一级A毛片| 经典三级在线视频| 亚洲欧美国产高清vA在线播放| 久久久久久久久久成人永久免费视频 | 自拍三级| 永久AV免费网站| 谁有毛片网站| 免费91视频| 超碰少妇| 日韩视频一区二区| 亚洲综合区| 中文无码人妻少妇| 欧美成人一级a片| 91在线视频免费播放| 网站啪啪| 五月天婷婷久久| 麻豆av在线观看| 怡春院av| 久久久999精品日韩一区二区| 亚洲日本黄色网址| 日本少妇久久| www.插逼| 毛片aaa| 免费无码又爽又黄又刺激网站| 国产视频一区二区三区四区五区| 日本A在线| 日韩人妻一区二区| 逼逼AV网站-日韩电影| 久久国产精品影院| 无码AA| 欧美日韩在线视频免费观看| 粉嫩小泬BBBB免费看-百度| 国产av播放| 一道本无码在线观看| 欧美大香蕉在线视频| 天天干天天射天天操| 成人AV在线电影| 激情五月丁香花| 亚洲另类图片小说| 91国产在线播放| 香蕉操逼视频| 天堂视频在线| 影音先锋无码AV| 成年片免费观看网站免费观看,亚洲+欧... | 黃色级A片一級片| 日皮免费视频| 黄色无無| 18禁成人A∨片| 国产无码性爱| 91精品丝袜久久久久久久久粉嫩| 日韩免费A片| 一级黄色大片| 国产无码乱伦内射| www黄色com| 国产迷奸视频| 在线视频一区二区三区| 精品乱子伦一区二区三区,亚洲国产成| 五月天堂婷婷| 日本午夜无码| 无码不卡在线| 18禁网站在线| 日韩免费在线视频观看| 亚洲熟妇在线观看| 国产精品视频99| 亚洲AV资源| 人妻日韩精品中文字幕| 亚洲视频在线观看中文字幕 | 色播视频在线观看| 人妻无码不卡| 西西人体大胆ww4444| 久操视频在线| 九九伊人大香蕉| 亚洲性无码| 懂色av粉嫩av蜜臀av| 久草社区| 人人操人人透| 黄片高清无码在线观看| 91丨九色丨熟女丰满| 精品国产91乱码一区二区三区| 干欧美美女| 欧美被操| 九九在线观看视频| 日韩中文字幕无码| 午夜精品久久久久久不卡8050| 日本A∨在线| 欧美激情视频一区二区| 青青青视频在线| 欧美footjob高跟脚交| 影音先锋AV无码| 欧美日日干| 香蕉婷婷| 秋霞无码一区二区三区| 精品a片| 伊人成年网| 影音先锋aV成人无码电影| 奇米影视av| 麻豆AV免费看| 日本成人三级片| 麻豆三级电影| 天天干天天射天天| 国产成人AV免费无码| 亚州精品人妻一二三区| 人妻少妇av中文字幕乱码牛牛| 精品久久久无码| 欧美激情视频一区二区| 91.xxxxx| 国产做受精品网站在线观看| 深爱激情五月婷婷| 伊人狠狠蜜桃亚洲综合| 国产九九| 国产资源网| 欧美性爱视频免费观看| 性久久久久久| 欧美A视频在线观看| 九色91PORNY国产| 四lll少妇BBBB槡BBBB| 久久福利导航| 中国熟睡妇BBwBBw| 天天操电影| 狠狠操综合网| 丁香花在线高清完整版视频| 国产videos| 国产成人小视频| 天天扣天天操| 17c白丝喷水自慰| 无码一道本一区二区无码| 国产av高清| 在线免费观看av网站| av色色| 丁香六月婷婷综合| 日韩av小说| 婷色五月天| 你懂的视频在线| 欧美大鸡吧视频| 91伊人| 亚洲无码福利| V天堂在线视频| 成人免费网站黄| 欧美精品在线播放| 可以免费观看的AV| 亚洲AV无码专区在线播放中文| 日韩二区三区| 在线看V片| 我要操影院| 操逼的网站| 在线观看免费高清无码| 超碰人人操在线| 色五月在线| 亚洲播播在线视频| 在线观看免费国产| 黄网站免费观看| 男人午夜网站| 亚洲va中文字幕| 亚洲视频一区| 91久久久久久久久久久久18| 欧美日韩精品一区二区| 性做久久久久久久久| 麻豆成人精品| 2025国产精品| 99在线精品视频在线观看| 狠狠操免费视频| 色婷婷久久综合久色| 亚洲视频在线免费| 欧美亚洲日韩一区二区三区| 国产一级黄色| yw尤物在线| 懂色av粉嫩av蜜臀av| 91视频美女内射| 黄片高清视频| 中日韩一级片| 在线免费高清无码| 亚洲理伦| 久久久久久久久久久久久久久久久久久久| 91无码人妻东京热精品一区| 免费无人区一码二码乱码怎么办|