C語(yǔ)言基礎(chǔ)及指針②之指針內(nèi)存分析

續(xù)接上篇 C語(yǔ)言基礎(chǔ)及指針①

在上一篇中 , 我們了解了C語(yǔ)言的基本語(yǔ)法 奴紧, 以及簡(jiǎn)單指針 , 也知道 晶丘, 指針是C語(yǔ)言的核心 黍氮, 那么我們今天就來(lái)簡(jiǎn)單剖析一下指針 , 了解他是怎么的神奇 浅浮。

今天是七夕 沫浆, 祝各位情人節(jié)快樂(lè) 。

指針的基本寫(xiě)法是int i = 10 ; int *p = &i ; 滚秩, 由此我們可以看出 专执, 指針和變量類似 , 其實(shí) 郁油, 指針也是變量 本股, 我們printf("%#x",p) , 輸出的就是i的地址值 桐腌, p就是一個(gè)變量 拄显, 只是這個(gè)變量不普通 , 他可以通過(guò)他里面地址 案站, 操作這個(gè)地址里面的內(nèi)容 躬审, 這就是其強(qiáng)大之處 。那么他在內(nèi)存中是怎樣的呢 ? 下面我們來(lái)看看 盒件。

指針操作內(nèi)存圖.png

由圖上我們可知 , 指針變量就是用來(lái)操作內(nèi)存空間的 舱禽, 當(dāng)然也可以作為變量存儲(chǔ) 炒刁, 例如int *p = 100 ; printf("指針變量的值:%d\n",p)這樣指針變量p就會(huì)輸出100 。

既然我們的指針也是變量 誊稚, 那么也是可以進(jìn)行運(yùn)算的 翔始, 下面我們就來(lái)看看 , 指針是怎么樣進(jìn)行運(yùn)算的 里伯。我們以一個(gè)數(shù)組輸出為例 城瞎, 來(lái)驗(yàn)證指針變量的運(yùn)算 , 如下:


void main() {
    
    int arr[] = { 89,20,13,45,68 };

    // 數(shù)組地址 疾瓮, 默認(rèn)是首個(gè)元素的內(nèi)存地址
    printf("輸出數(shù)組arr地址:%#x\n", &arr);
    printf("這樣也可以獲取到數(shù)組的地址:%#x\n", arr);
    printf("第一個(gè)元素的地址: %#x\n", &arr[0]);

    int* p = &arr;
   // 以普通的方式進(jìn)行數(shù)組輸出
    int i = 0;
    for (; i < 5; i++)
    {
        printf("數(shù)組元素:%d\n", arr[i]);
    }

    printf("\n");

    // 以指針運(yùn)算的方式進(jìn)行數(shù)組輸出
    int j = 0; 
    for (; j < 5; j++)
    {
        printf("數(shù)組元素的值 : %d\n", *p);
        p++;
    }

    printf("\n");

    getchar();
}

從上述代碼我們可以看出 脖镀, 我們通過(guò)變量指針p進(jìn)行p++操作 , 來(lái)獲取到數(shù)組中的值 狼电, 這樣操作的可能是 蜒灰, 因?yàn)閿?shù)組存儲(chǔ)數(shù)據(jù)的內(nèi)存空間是連續(xù)的 , 可以可以通過(guò)同類型的指針 肩碟, 進(jìn)行指針運(yùn)算來(lái)進(jìn)行內(nèi)存操作 强窖, 值得注意的是 , 指針類型必須和數(shù)組類型一致 削祈,才能進(jìn)行內(nèi)存操作 翅溺。由此 , 我們可以得出指針為什么需要類型的答案了:

指針是存儲(chǔ)的地址是開(kāi)始讀取的位置 髓抑, 類型是讀取的長(zhǎng)度 咙崎, 操作類型必須一致 。

下面我們來(lái)做一個(gè)實(shí)驗(yàn) 启昧, 如果使用不同類型的指針來(lái)讀取數(shù)組 叙凡, 這樣操作會(huì)出現(xiàn)什么情況 , 我們將上述代碼的int *p = @arr ;更改為float *p = &arr;會(huì)出現(xiàn)什么情況呢 ? 結(jié)果如下:

  
數(shù)組元素的值 : 0
數(shù)組元素的值 : 0
數(shù)組元素的值 : 0
數(shù)組元素的值 : 0
數(shù)組元素的值 : 0

我們使用float類型的指針 密末, 去操作int類型的數(shù)組 握爷, 就完全取不到值了 。為什么會(huì)這樣呢 严里? 我們一探究竟 新啼, 打斷點(diǎn)去查看內(nèi)存的 , 我們輸出一下指針變量的值 刹碾, 然后對(duì)照數(shù)組變量的地址燥撞,如下:

  
指針變量存儲(chǔ)的值:0x101fdac -- 取值:0
數(shù)組元素:89 == 數(shù)組元素地址:0x101fdac
數(shù)組元素:20 == 數(shù)組元素地址:0x101fdb0
數(shù)組元素:13 == 數(shù)組元素地址:0x101fdb4
數(shù)組元素:45 == 數(shù)組元素地址:0x101fdb8
數(shù)組元素:68 == 數(shù)組元素地址:0x101fdbc

數(shù)組元素的值 : 0 == 指針存儲(chǔ)的地址:0x37064000
數(shù)組元素的值 : 0 == 指針存儲(chǔ)的地址:0x36e40000
數(shù)組元素的值 : 0 == 指針存儲(chǔ)的地址:0x36da0000
數(shù)組元素的值 : 0 == 指針存儲(chǔ)的地址:0x36f68000
數(shù)組元素的值 : 0 == 指針存儲(chǔ)的地址:0x37010000

我們可以看到 , 幾乎完全不一致了 , 地址都不相同了 物舒, 我有一個(gè)疑惑 色洞, 在第一次打印float指針變量值的時(shí)候 , 存儲(chǔ)的是數(shù)組第一個(gè)變量的內(nèi)存地址 冠胯, 但是在循環(huán)遍歷的時(shí)候 火诸, 卻不一樣了 , 目前不知道是什么原因?qū)е碌?荠察, 有知道的希望告知一下 置蜀。上述輸出完整程序:

以上問(wèn)題有一個(gè)答案了 , 雖然float和int類型都是四字節(jié)的 悉盆, 但是int 和 float的存儲(chǔ)方式不一樣 盯荤, 所有指針運(yùn)算會(huì)出現(xiàn)不一樣 。

  
void main() {
    
    int arr[] = { 89,20,13,45,68 };

    // 數(shù)組地址 焕盟, 默認(rèn)是首個(gè)元素的內(nèi)存地址
    printf("輸出數(shù)組arr地址:%#x\n", &arr);
    printf("這樣也可以獲取到數(shù)組的地址:%#x\n", arr);
    printf("第一個(gè)元素的地址: %#x\n", &arr[0]);

    //int* p = &arr;
    float *p = &arr;

    printf("指針變量存儲(chǔ)的值:%#x -- 取值:%f\n", p,*p);

    int i = 0;
    for (; i < 5; i++)
    {
        printf("數(shù)組元素:%d == 數(shù)組元素地址:%#x\n", arr[i],&arr[i]);
    }

    printf("\n");

    int j = 0; 
    for (; j < 5; j++)
    {
        printf("數(shù)組元素的值 : %f == 指針存儲(chǔ)的地址:%#x\n", *p,p);
        p++;
    }
    
    printf("\n");


    getchar();
}

這次我們分析了指針在內(nèi)存中的情況 秋秤, 以及指針變量的簡(jiǎn)單運(yùn)算 , 下次我們來(lái)聊聊 脚翘, 指針在方法中的運(yùn)用 航缀, 以及二級(jí)指針 。

Android程序員學(xué)C系列:
C語(yǔ)言基礎(chǔ)及指針①
C語(yǔ)言基礎(chǔ)及指針②之指針內(nèi)存分析
C語(yǔ)言基礎(chǔ)及指針③函數(shù)與二級(jí)指針
C語(yǔ)言基礎(chǔ)及指針④函數(shù)指針
C語(yǔ)言基礎(chǔ)及指針⑤動(dòng)態(tài)內(nèi)存分配
C語(yǔ)言基礎(chǔ)及指針⑥字符操作
C語(yǔ)言基礎(chǔ)及指針⑦結(jié)構(gòu)體與指針
C語(yǔ)言基礎(chǔ)及指針⑧文件IO
C語(yǔ)言基礎(chǔ)及指針⑨聯(lián)合體與枚舉
C語(yǔ)言基礎(chǔ)及指針⑩預(yù)編譯及jni.h分析

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末堰怨,一起剝皮案震驚了整個(gè)濱河市芥玉,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌备图,老刑警劉巖灿巧,帶你破解...
    沈念sama閱讀 218,546評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異揽涮,居然都是意外死亡抠藕,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)蒋困,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)盾似,“玉大人,你說(shuō)我怎么就攤上這事雪标×阍海” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,911評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵村刨,是天一觀的道長(zhǎng)告抄。 經(jīng)常有香客問(wèn)我,道長(zhǎng)嵌牺,這世上最難降的妖魔是什么打洼? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,737評(píng)論 1 294
  • 正文 為了忘掉前任龄糊,我火速辦了婚禮,結(jié)果婚禮上募疮,老公的妹妹穿的比我還像新娘炫惩。我一直安慰自己,他們只是感情好阿浓,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,753評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布诡必。 她就那樣靜靜地躺著,像睡著了一般搔扁。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蟋字,一...
    開(kāi)封第一講書(shū)人閱讀 51,598評(píng)論 1 305
  • 那天稿蹲,我揣著相機(jī)與錄音,去河邊找鬼鹊奖。 笑死苛聘,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的忠聚。 我是一名探鬼主播设哗,決...
    沈念sama閱讀 40,338評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼两蟀!你這毒婦竟也來(lái)了网梢?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,249評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤赂毯,失蹤者是張志新(化名)和其女友劉穎战虏,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體党涕,經(jīng)...
    沈念sama閱讀 45,696評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡烦感,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,888評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了膛堤。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片手趣。...
    茶點(diǎn)故事閱讀 40,013評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖肥荔,靈堂內(nèi)的尸體忽然破棺而出绿渣,到底是詐尸還是另有隱情,我是刑警寧澤燕耿,帶...
    沈念sama閱讀 35,731評(píng)論 5 346
  • 正文 年R本政府宣布怯晕,位于F島的核電站,受9級(jí)特大地震影響缸棵,放射性物質(zhì)發(fā)生泄漏舟茶。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,348評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望吧凉。 院中可真熱鬧隧出,春花似錦、人聲如沸阀捅。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,929評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)饲鄙。三九已至凄诞,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間忍级,已是汗流浹背帆谍。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,048評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留轴咱,地道東北人汛蝙。 一個(gè)月前我還...
    沈念sama閱讀 48,203評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像朴肺,于是被迫代替她去往敵國(guó)和親窖剑。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,960評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 指針是C語(yǔ)言中廣泛使用的一種數(shù)據(jù)類型戈稿。 運(yùn)用指針編程是C語(yǔ)言最主要的風(fēng)格之一西土。利用指針變量可以表示各種數(shù)據(jù)結(jié)構(gòu); ...
    朱森閱讀 3,446評(píng)論 3 44
  • 1.語(yǔ)言中變量的實(shí)質(zhì) 要理解C指針鞍盗,我認(rèn)為一定要理解C中“變量”的存儲(chǔ)實(shí)質(zhì)翠储, 所以我就從“變量”這個(gè)東西開(kāi)始講起吧...
    金巴多閱讀 1,779評(píng)論 0 9
  • 一、框架 1橡疼、Mac系統(tǒng)及常用工具援所、進(jìn)制;C數(shù)據(jù)類型、常量變量欣除、運(yùn)算符住拭、表達(dá)式、格式化輸入輸出 2历帚、關(guān)系運(yùn)算符滔岳、邏...
    師景福閱讀 692評(píng)論 0 2
  • 鐘愛(ài)文字詩(shī)話 不恨墨少情多 只愿此愛(ài)不去 芬芳常駐心頭 2017.6.3.于哈市
    懷古的弄潮兒閱讀 251評(píng)論 0 3
  • 文|不舍 上午健美操,狠狠出了一身汗挽牢,很過(guò)癮谱煤。還想盡興拉伸,活動(dòng)日漸僵硬的身體禽拔。體育也是一門(mén)很深的學(xué)科刘离,鍛煉身體的...
    blue1977閱讀 255評(píng)論 0 0