乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      C語言的靈魂|“指針”

       回家的夢想 2019-10-20

      C語言的靈魂|“指針”

      什么是指針?從根本上看,指針是一個(gè)值為內(nèi)存地址的變量。

      ——《C primer plus》

      指針,一直都是C語言的重點(diǎn)。初學(xué)C的人可能只是知道,它是變量的地址,但卻不知道,學(xué)這個(gè)變量的地址有什么用。指針的偉大之處其實(shí)并不在語言本身,而是在于它和結(jié)構(gòu)體搭配產(chǎn)生的一種叫數(shù)據(jù)結(jié)構(gòu)的東西。如鏈表隊(duì)列棧,樹圖等。所以,雖然在現(xiàn)在指針用到的地方不多,但還是要好好掌握這個(gè)知識。

      &和*

      在我們之前有學(xué)到那么一個(gè)運(yùn)算符是&取地址符,它的作用是返回變量的地址,我們現(xiàn)在要獲取一個(gè)變量的地址,讓它賦值給一個(gè)指針變量,可以這樣子操作。

      1inta=0;

      2int*p=&a;

      這樣我們就把a(bǔ)的地址賦值給了p這個(gè)指針變量,注意指針變量是p而不是*p。上面也代表著p這個(gè)指針變量指向了a。如果你想聲明double類型的指針就可以把上面兩個(gè)都換成double。為什么都要換掉,去區(qū)分開不同類型的指針呢?每個(gè)指針變量的空間大小都是一樣的,因?yàn)樗皇莾Υ娴刂?,都是指針變量?/strong>既然用到的空間一樣,那我們指針就指針唄,要區(qū)分int,double指針干嘛。這個(gè)問題我們留到下面指針的加法來討論。

      指針的存儲

      指針是按照16進(jìn)制儲存在指針變量中的,用%p對一個(gè)指針變量進(jìn)行printf操作,可以得到指針的16進(jìn)制地址。

      這樣子,就是把p所指的內(nèi)容a賦值給了x。

      1printf('%p',p);

      指針的操作

      對于* 這個(gè)運(yùn)算符,用在聲明的時(shí)候表示的是聲明一個(gè)指針變量,就像上面那樣。聲明了一個(gè)int型的指針變量。

      除了聲明之外,用*對一個(gè)變量進(jìn)行操作就可以對它地址上的內(nèi)容,也就是這個(gè)指針?biāo)傅淖兞窟M(jìn)行操作。如賦值:

      1intx=*p;

      這里我們就將p這個(gè)指針變量所指向的內(nèi)容。如果p指向的是a變量,那么給x賦值的就是a的值。

      解引用后的四則運(yùn)算

      1(*p)=(*p)+1;

      為什么要括號呢,因?yàn)樵谶@里我們可以更加直觀的看出,是p指向的指針在進(jìn)行加法而不是p這個(gè)指針變量在進(jìn)行加法。

      指針與一維數(shù)組

      在上一篇的數(shù)組中,我們講到了數(shù)組名是數(shù)組的地址,而在這篇文章中,我們又提到了指針是一個(gè)儲存地址的變量,那這樣的話,數(shù)組和指針是有關(guān)聯(lián)的。

      如果我們要數(shù)組第一個(gè)元素的地址,可以如下

      1inta[10];

      2int*p=&a[0];

      如果我們要數(shù)組的地址,可以如下

      1int*q=a;

      我用%p打印出來出來后是下面這兩個(gè)(不同機(jī)器的地址會和這里不一樣)

      1000000000065FE20

      2000000000065FE20

      雖然它們的地址是一樣的,但是這兩個(gè)指針的類型是不一樣的,第一個(gè)指的是數(shù)組的第一個(gè)元素的地址,第二個(gè)指的是整個(gè)數(shù)組的地址。

      指針+整數(shù)

      當(dāng)給指針加上整數(shù)的時(shí)候,因?yàn)橹羔樦傅氖堑刂?,所以?dāng)我們用指針加整數(shù)的時(shí)候就是原來的地址加上指針類型*要加的整數(shù)。

      就拿一個(gè)小區(qū)來說,每個(gè)房子之間的距離是4米(模擬int的字節(jié)數(shù))。如有一家的門牌號是3。你給地址加一個(gè)數(shù)字,它的地址會加上4乘上這個(gè)小區(qū)的房子距離。就會是第4個(gè)門牌號的房子的地址。

      如果你在另一個(gè)小區(qū),房子間的距離比較大了,為8米(模擬double的字節(jié))。也是假如有一家的門牌號是3。你給地址加一個(gè)數(shù)字,那么這個(gè)時(shí)候,給地址加上的應(yīng)該是這個(gè)小區(qū)的房子距離8乘以加的數(shù)字。才可以得到準(zhǔn)確的房子地址。

      這就為什么我們要區(qū)分不同的指針類似了。在兩個(gè)小區(qū)中,計(jì)算一開始的地址都是3,但是因?yàn)樾^(qū)的房子間距不一樣,所以它們需要加的那個(gè)數(shù)字就會因?yàn)檫@個(gè)距離而變化,不只是看這個(gè)整數(shù)。

      舉一個(gè)數(shù)組和指針的例子

      1inta[10];

      2printf('%d',*(a+3));

      以上會打印出a[3]這個(gè)變量,因?yàn)槲覀冊诮庖们跋葘χ羔?3,讓它移動到了a[3]的位置。給他解引用后就是a[3]的值了。

      指針減整數(shù)

      這個(gè)指針減去整數(shù)就和上面的指針加整數(shù)差不多,就是減去指針類型*要減的整數(shù)。要注意的是當(dāng)它用在數(shù)組名上時(shí),不要讓指針指在數(shù)組外面。

      指針減指針

      可以想一下,當(dāng)兩個(gè)門牌號相減的時(shí)候會得到什么?是兩個(gè)房子的門牌號之差,而不是兩個(gè)房子的距離。這里要注意的是,指針減指針一般是用在數(shù)組中,例如

      1inta[10]

      2intx=&a[3]-&a[0];

      這就是指針的一些基本知識了,關(guān)于二維數(shù)組用指針表示,這里不多寫了。如果你覺得不懂這二維數(shù)組和指針的關(guān)系的話,或者對于文章內(nèi)容有什么建議,可以關(guān)注我,我來替你解答!

      “全球最大的C/C++人員聚集地就在我這里,企鵝裙餿直播編程學(xué)習(xí),【14】就是我的。不管你是什么基礎(chǔ),來了就是兄弟,是兄弟就跟我一起學(xué)習(xí)C/C++!關(guān)注我,為編程點(diǎn)贊,每天學(xué)點(diǎn)小知識!工作需要、感興趣、為了入行、轉(zhuǎn)行需要學(xué)習(xí)C/C++的伙伴可以跟我學(xué)習(xí),技術(shù)大牛、學(xué)習(xí)資料等助你早日成為一名優(yōu)秀的程序員!

      C語言的靈魂|“指針”

        本站是提供個(gè)人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多