久久婷婷香蕉热狠狠综合,精品无码国产自产拍在线观看蜜,寡妇房东在做爰3,中文字幕日本人妻久久久免费,国产成人精品三上悠亚久久

當前位置:首頁 > 嵌入式培訓 > 嵌入式學習 > 講師博文 > C語言指針

C語言指針 時間:2018-12-25      來源(yuan):華清遠見

關(guan)于指(zhi)針(zhen)(zhen)我上學的時候學,我的老(lao)師說(shuo)“指(zhi)針(zhen)(zhen)很難呢“,把指(zhi)針(zhen)(zhen)比(bi)喻成門牌(pai)號,信封(feng)郵(you)寄地址(zhi),現(xian)在我看到指(zhi)針(zhen)(zhen)就想起(qi)門牌(pai)號,信封(feng)地址(zhi)。

地址:

說(shuo)到指(zhi)針,先說(shuo)說(shuo)地址(zhi),看一段小程序(xu)

#include "stdio.h"

int main()

{

    int a = 10;

    int *p = &a;

    printf("%p\n", p);

    return 0;  

}

// output

0x7fff8b6a378c

每(mei)當(dang)我看(kan)到(dao)指(zhi)針的(de)(de)(de)輸出 像這種"0x7fff8b6a378c"時候(hou),頭都大了(le),那(nei)時候(hou)老師說是(shi)地(di)址(zhi)(zhi),搞得(de)糊(hu)里糊(hu)涂的(de)(de)(de)。那(nei)什么是(shi)地(di)址(zhi)(zhi)呢?當(dang)然我幫你(ni)百科一(yi)下。是(shi)系統 RAM 中(zhong)的(de)(de)(de)特定位置,通(tong)常以十六(liu)進(jin)制的(de)(de)(de)數(shu)字表示,系統通(tong)過這個地(di)址(zhi)(zhi),就可(ke)以找(zhao)到(dao)相(xiang)應的(de)(de)(de)內(nei)容。當(dang)使用80386時,我們必須區(qu)分(fen)以下三(san)種不(bu)同的(de)(de)(de)地(di)址(zhi)(zhi):邏(luo)(luo)(luo)輯(ji)(ji)地(di)址(zhi)(zhi)、線性地(di)址(zhi)(zhi)、物(wu)理(li)地(di)址(zhi)(zhi);在進(jin)行(xing)C語言指(zhi)針編程(cheng)(cheng)中(zhong),可(ke)以讀(du)取指(zhi)針變量本(ben)身值(&操作),實(shi)際(ji)上這個值就是(shi)邏(luo)(luo)(luo)輯(ji)(ji)地(di)址(zhi)(zhi),它是(shi)相(xiang)對于你(ni)當(dang)前進(jin)程(cheng)(cheng)數(shu)據(ju)段的(de)(de)(de)地(di)址(zhi)(zhi)(偏移地(di)址(zhi)(zhi)),不(bu)和(he)絕對物(wu)理(li)地(di)址(zhi)(zhi)相(xiang)干,比如上面(mian)那(nei)個"0x7fff8b6a378c" 就是(shi)邏(luo)(luo)(luo)輯(ji)(ji)地(di)址(zhi)(zhi)。邏(luo)(luo)(luo)輯(ji)(ji)地(di)址(zhi)(zhi)不(bu)是(shi)被直接送到(dao)內(nei)存(cun)總線,而是(shi)被送到(dao)內(nei)存(cun)管理(li)單元(yuan)(MMU)。MMU由一(yi)個或(huo)一(yi)組芯片(pian)組成(cheng),其功(gong)能是(shi)把(ba)邏(luo)(luo)(luo)輯(ji)(ji)地(di)址(zhi)(zhi)映射(she)為物(wu)理(li)地(di)址(zhi)(zhi),即進(jin)行(xing)地(di)址(zhi)(zhi)轉換(huan)。下面(mian)是(shi)轉換(huan)關(guan)系圖。

C語言指針,C語言學習

指針:

c語言相比(bi)匯編算應該算是(shi)高(gao)級了(le),卻(que)保(bao)留的(de)了(le)操(cao)作地(di)址(zhi)中(zhong)高(gao)效的(de)又抽象(xiang)的(de)形式。那么指針(zhen)(zhen)到底是(shi)什么呢(ni)? 在(zai)那本經典《c 程序設計語言》 是(shi)這(zhe)樣描述 : ”指針(zhen)(zhen)是(shi)一(yi)(yi)種(zhong)保(bao)存(cun)變(bian)(bian)量(liang)地(di)址(zhi)的(de)變(bian)(bian)量(liang)“,指針(zhen)(zhen)是(shi)一(yi)(yi)個(ge)(ge)特(te)殊的(de)變(bian)(bian)量(liang),它里(li)面(mian)存(cun)儲(chu)(chu)的(de)數值被解釋成為(wei)內(nei)(nei)(nei)存(cun)里(li)的(de)一(yi)(yi)個(ge)(ge)地(di)址(zhi),指針(zhen)(zhen)與地(di)址(zhi)不要混在(zai)一(yi)(yi)起,指針(zhen)(zhen)是(shi)存(cun)儲(chu)(chu)地(di)址(zhi)一(yi)(yi)個(ge)(ge)變(bian)(bian)量(liang),地(di)址(zhi)是(shi)內(nei)(nei)(nei)存(cun)分配。指針(zhen)(zhen)可以指向(xiang)這(zhe)個(ge)(ge)內(nei)(nei)(nei)存(cun)地(di)址(zhi),也可以指向(xiang)另一(yi)(yi)個(ge)(ge)內(nei)(nei)(nei)存(cun)地(di)址(zhi),當指針(zhen)(zhen)指向(xiang)一(yi)(yi)個(ge)(ge)內(nei)(nei)(nei)存(cun)地(di)址(zhi),它們(men)之間(jian)才發生聯系,通(tong)過這(zhe)個(ge)(ge)指針(zhen)(zhen)去(qu)操(cao)作這(zhe)塊內(nei)(nei)(nei)存(cun),所(suo)以指針(zhen)(zhen)把我們(men)帶入到地(di)址(zhi)層(ceng)面(mian)去(qu)操(cao)作數據,在(zai)php,java 這(zhe)些高(gao)級語言沒有這(zhe)一(yi)(yi)層(ceng)的(de)操(cao)作。舉個(ge)(ge)例子 

//字(zi)符串(chuan)翻(fan)轉例子(zi)

#include "stdio.h"

#include "string.h"

void revstr(char *);

int main()

{

    char str[] = ";Zhen Shan Ren is good!";

    revstr(str);

    puts(str);

}

void revstr(char *str) 

{

    char *start, *end, temp;

    start = str;

    end = start + strlen(str) -1;

    while (start++ < end--) {

        temp = *start;

        *start = *end;

        *end = temp;

    }

}

上面的(de)(de)(de)例子是(shi)(shi)從指(zhi)(zhi)(zhi)(zhi)(zhi)針(zhen)(zhen)的(de)(de)(de)角度去(qu)(qu)處理字(zi)符(fu)串,我(wo)再(zai)(zai)revstr 函數(shu)中定義了兩(liang)個指(zhi)(zhi)(zhi)(zhi)(zhi)針(zhen)(zhen),一(yi)(yi)個指(zhi)(zhi)(zhi)(zhi)(zhi)針(zhen)(zhen)指(zhi)(zhi)(zhi)(zhi)(zhi)向字(zi)符(fu)串的(de)(de)(de)首地(di)址(zhi)(zhi)(zhi),另一(yi)(yi)個指(zhi)(zhi)(zhi)(zhi)(zhi)針(zhen)(zhen)指(zhi)(zhi)(zhi)(zhi)(zhi)向字(zi)符(fu)串的(de)(de)(de)末地(di)址(zhi)(zhi)(zhi),把內(nei)容(rong)互(hu)換。 指(zhi)(zhi)(zhi)(zhi)(zhi)針(zhen)(zhen)提供這樣便利,可以通過加(jia)、減(jian)來訪問這一(yi)(yi)塊(kuai)內(nei)存。然(ran)后再(zai)(zai)去(qu)(qu)改變內(nei)存的(de)(de)(de)值。如果(guo)沒有指(zhi)(zhi)(zhi)(zhi)(zhi)針(zhen)(zhen),只能去(qu)(qu)操作這樣邏輯地(di)址(zhi)(zhi)(zhi) “0x7fff8b6a378c”去(qu)(qu)計算下一(yi)(yi)個或(huo)上一(yi)(yi)個邏輯地(di)址(zhi)(zhi)(zhi),會(hui)不(bu)會(hui)瘋(feng)掉呢?所以指(zhi)(zhi)(zhi)(zhi)(zhi)針(zhen)(zhen)把我(wo)們帶入到(dao)地(di)址(zhi)(zhi)(zhi)層面去(qu)(qu)操作數(shu)據。指(zhi)(zhi)(zhi)(zhi)(zhi)針(zhen)(zhen)難點是(shi)(shi)我(wo)們不(bu)是(shi)(shi)很清楚有些復(fu)雜的(de)(de)(de)數(shu)據類型的(de)(de)(de)在內(nei)存中存儲。指(zhi)(zhi)(zhi)(zhi)(zhi)來指(zhi)(zhi)(zhi)(zhi)(zhi)去(qu)(qu)不(bu)知(zhi)道指(zhi)(zhi)(zhi)(zhi)(zhi)向那(nei)了。如果(guo)你能很清楚內(nei)存的(de)(de)(de)分布,就不(bu)會(hui)指(zhi)(zhi)(zhi)(zhi)(zhi)錯(cuo)地(di)方!

指針的幾個概(gai)念:

1.指針的類型(xing):

基本(ben)數(shu)據類(lei)型比如(ru) int、char ,還有 一些復雜的(de)(de)比如(ru) int (*p)[], 指(zhi)(zhi)(zhi)向數(shu)組的(de)(de)指(zhi)(zhi)(zhi)針(zhen),像這(zhe)種的(de)(de)判斷(duan)就(jiu)是(shi)指(zhi)(zhi)(zhi)針(zhen)名字(zi)去掉(diao) , 指(zhi)(zhi)(zhi)針(zhen)的(de)(de)類(lei)型類(lei)型就(jiu)是(shi) int(*)[],其實就(jiu)是(shi)指(zhi)(zhi)(zhi)向數(shu)組的(de)(de)指(zhi)(zhi)(zhi)針(zhen)

2.指(zhi)針所(suo)指(zhi)向的類型(xing):

當你通過指(zhi)(zhi)針來訪(fang)問指(zhi)(zhi)針所(suo)(suo)指(zhi)(zhi)向的內存區時,指(zhi)(zhi)針所(suo)(suo)指(zhi)(zhi)向的類型(xing)決定了編譯器將(jiang)把(ba)那片(pian)內存區里(li)的內容當做什么來看待。  你只須把(ba)指(zhi)(zhi)針聲明語句中的指(zhi)(zhi)針名字(zi)和名字(zi)左邊的指(zhi)(zhi)針聲明符*去(qu)掉,剩下的就是指(zhi)(zhi)針所(suo)(suo)指(zhi)(zhi)向的類型(xing)。

例如:int*ptr:指(zhi)針所(suo)指(zhi)向的類型是int   int(*ptr)[3]:指(zhi)針所(suo)指(zhi)向的的類型是int()[3] 

3.指針的值:

我們說一(yi)(yi)個(ge)指(zhi)(zhi)針的值(zhi)是(shi)XX,就(jiu)相當于說該(gai)指(zhi)(zhi)針指(zhi)(zhi)向了以XX為(wei)首(shou)地(di)址的一(yi)(yi)片內存(cun)區域;我們說一(yi)(yi)個(ge)指(zhi)(zhi)針指(zhi)(zhi)向了某(mou)塊內存(cun)區域,就(jiu)相當于說該(gai)指(zhi)(zhi)針的值(zhi)是(shi)這塊內存(cun)區域的首(shou)地(di)址。 

看一段(duan)代碼:這段(duan)代碼是問你p1 是否和p2 相等(deng)?

#include "stdio.h"

int main()

{

    char *p1,*p2,*p3;

    char ch[] = {'a', 'b', 'c'};

    char **pp;

    p1 = ch;

    pp = &ch;

    p2 = *pp;

    if (p1 == p2) {

      printf("p1  == p2\n");

    } else {

      printf("p1 != p2\n");

    }

    printf("p3 = %p", p3);

    return 0;

}

  結果是:

//p1 != p2

//p3 = 0x4005f0dxy

&ch  指(zhi)(zhi)(zhi)(zhi)針(zhen)(zhen)類型(xing)為(wei) char (*)[3], 當運行到(dao)pp=&ch 時候,編譯器會罵你 “warning: assignment from incompatible pointer type” 指(zhi)(zhi)(zhi)(zhi)針(zhen)(zhen)類型(xing)不(bu)(bu)匹配(在vc6下直接(jie)報錯)。看一下p3 會有一個值(zhi),未初始化(hua)指(zhi)(zhi)(zhi)(zhi)針(zhen)(zhen)是(shi)(shi)(shi)有內存(cun)地(di)址(zhi)(zhi)的,而且(qie)是(shi)(shi)(shi)一個垃圾(ji)地(di)址(zhi)(zhi)。不(bu)(bu)知道這(zhe)(zhe)個內存(cun)地(di)址(zhi)(zhi)指(zhi)(zhi)(zhi)(zhi)向(xiang)的值(zhi)是(shi)(shi)(shi)什(shen)么。這(zhe)(zhe)就(jiu)是(shi)(shi)(shi)為(wei)什(shen)么不(bu)(bu)要(yao)對未初始化(hua)指(zhi)(zhi)(zhi)(zhi)針(zhen)(zhen)取值(zhi)的原因。最(zui)(zui)好的情(qing)(qing)況(kuang)是(shi)(shi)(shi)你取到(dao)的是(shi)(shi)(shi)垃圾(ji)地(di)址(zhi)(zhi)接(jie)下來你需要(yao)對程序(xu)進行調(diao)試,最(zui)(zui)壞的情(qing)(qing)況(kuang)則(ze)會導(dao)致程序(xu)崩潰。以后,每(mei)遇到(dao)一個指(zhi)(zhi)(zhi)(zhi)針(zhen)(zhen),都應該(gai)問問:這(zhe)(zhe)個指(zhi)(zhi)(zhi)(zhi)針(zhen)(zhen)的類型(xing)是(shi)(shi)(shi)什(shen)么?指(zhi)(zhi)(zhi)(zhi)針(zhen)(zhen)指(zhi)(zhi)(zhi)(zhi)的類型(xing)是(shi)(shi)(shi)什(shen)么?該(gai)指(zhi)(zhi)(zhi)(zhi)針(zhen)(zhen)指(zhi)(zhi)(zhi)(zhi)向(xiang)了哪里?  

還(huan)有一個題目(mu)可以試(shi)試(shi)

#include "stdio.h"

int main()

{

  int a[5] = {1,2,3,4,5};

  int *p = (int *)(&a+1);

   printf("%d,%d", *(a+1), *(p-1));

}

 

答案在此

指針(zhen)與數組 

“數組名就是(shi)(shi)指針(zhen)”,“你就把當做指針(zhen)理解”,假(jia)設數組名是(shi)(shi)指針(zhen)

#include "stdio.h"

 

int main()

{

int a[] = {1,2,3,5};

int *p = a;

printf("a = %d, p =%d", sizeof(a), sizeof(p));

}

//output

//a= 16,p=4

從輸出結果(guo)看兩(liang)者(zhe)根本就(jiu)是兩(liang)個事物(wu),只能說數(shu)組名(ming)神似指(zhi)針,數(shu)組名(ming)的內涵在(zai)于(yu)其指(zhi)代實體是一種(zhong)數(shu)據結構(gou),這種(zhong)數(shu)據結構(gou)就(jiu)是數(shu)組;那(nei)么數(shu)組名(ming)到底是什么:

符號(hao)表(biao)是(shi)編譯(yi)原理中的(de)(de)一(yi)個(ge)概念(nian),應用(yong)于編譯(yi)器(qi)(qi)(qi)(qi)的(de)(de)詞法分析(xi)和語義(yi)分析(xi)兩(liang)個(ge)階段(duan)。詞法分析(xi)的(de)(de)目標是(shi)讓編譯(yi)器(qi)(qi)(qi)(qi)能(neng)知道(dao)這是(shi)個(ge)數(shu)(shu)(shu)(shu)組(zu)就好了(le),那么(me)(me)(me)(me)語義(yi)分析(xi)階段(duan)就需要確定這個(ge)數(shu)(shu)(shu)(shu)組(zu)的(de)(de)具體空間(jian)了(le)。所以我(wo)們(men)(men)定義(yi)了(le)一(yi)個(ge)數(shu)(shu)(shu)(shu)組(zu),編譯(yi)器(qi)(qi)(qi)(qi)就會在符號(hao)表(biao)中加入數(shu)(shu)(shu)(shu)組(zu)的(de)(de)名字a,并(bing)且根據其(qi)指定的(de)(de)大小,開辟一(yi)段(duan)內存(cun)(cun)(cun)空間(jian),把(ba)這段(duan)內存(cun)(cun)(cun)空間(jian)的(de)(de)首地址(zhi)(也就是(shi)第一(yi)個(ge)元(yuan)素的(de)(de)地址(zhi))存(cun)(cun)(cun)入符號(hao)表(biao),這也就是(shi)為什么(me)(me)(me)(me)我(wo)們(men)(men)通過數(shu)(shu)(shu)(shu)組(zu)名就可以去訪問數(shu)(shu)(shu)(shu)組(zu)的(de)(de)元(yuan)素了(le)。編譯(yi)器(qi)(qi)(qi)(qi)這么(me)(me)(me)(me)做是(shi)為了(le)使我(wo)們(men)(men)使用(yong)數(shu)(shu)(shu)(shu)組(zu)更加的(de)(de)方便(bian),易懂。也有人說a是(shi)一(yi)個(ge)內存(cun)(cun)(cun)地址(zhi),也沒有什么(me)(me)(me)(me)不(bu)妥(tuo)的(de)(de),因為編譯(yi)器(qi)(qi)(qi)(qi)允許(xu)我(wo)們(men)(men)直接把(ba)a作為數(shu)(shu)(shu)(shu)組(zu)首地址(zhi)來用(yong)。數(shu)(shu)(shu)(shu)組(zu)是(shi)一(yi)種線性的(de)(de)數(shu)(shu)(shu)(shu)據結(jie)構,數(shu)(shu)(shu)(shu)組(zu)名指向了(le)那一(yi)片內存(cun)(cun)(cun)。

上一篇:嵌入式學科:float

下一篇:干貨分享 javasleep

熱點文(wen)章推薦
華清學員就(jiu)業(ye)榜單
高(gao)薪(xin)學員經驗分(fen)享
熱(re)點新聞(wen)推薦
前臺專(zhuan)線:010-82525158 企業培訓洽(qia)談專線:010-82525379 院校(xiao)合作洽談專線:010-82525379 Copyright © 2004-2022 北京華清遠見科技集團有限公司 版權所有 ,,京公海網安備11010802025203號

回到頂部