最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

深入理解C語言指針及占據(jù)內(nèi)存空間

 更新時(shí)間:2020年02月10日 10:17:46   作者:拿著保溫瓶的年輕人  
這篇文章主要介紹了C語言指針及占據(jù)內(nèi)存空間的相關(guān)知識(shí),非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

原文鏈接:https://www.cnblogs.com/l-hh/p/12288613.html

第一、了解內(nèi)存空間

本文章文字有點(diǎn)多,會(huì)有點(diǎn)枯燥,配合圖文一起看可以緩解枯燥,耐心閱讀哦?。?!

先了解內(nèi)存地址,才更好的理解指針!

我們可以把內(nèi)存想象為成一列很長很長的貨運(yùn)火車,有很多大小相同的車廂,而每個(gè)車廂正好相當(dāng)于在內(nèi)存中表示一個(gè)字節(jié)。這些車廂裝著不同的貨物,就像我們的內(nèi)存要存著各式各樣的數(shù)據(jù)。

多啰嗦一下

我們平時(shí)在電腦上能夠聽音樂、看視頻和文章,其實(shí)看到的這些東西就是內(nèi)存中每個(gè)“車廂”里面的數(shù)據(jù),這些數(shù)據(jù)最終還是由二進(jìn)制0/1演變而成。

雖然視頻、文章、音樂等這些信息在我們眼里是不同的,但對(duì)于計(jì)算機(jī)來說它們在內(nèi)存中都是以二進(jìn)制的形式來表示。

因?yàn)槲覀円廊ツ拇婊蛉?shù)據(jù),所以內(nèi)存中每個(gè)字節(jié)都有對(duì)應(yīng)的編號(hào),就像火車上的車廂編號(hào)一樣。而這個(gè)內(nèi)存中每個(gè)字節(jié)的編號(hào)就是我們常說的內(nèi)存地址,是按一個(gè)字節(jié)接著一個(gè)字節(jié)的次序進(jìn)行編址。如下圖所示:

凡事多問幾個(gè)為什么?

1. 為什么內(nèi)存地址都有0x開頭?

0x 開頭代表以十六進(jìn)制來表示的意思。

2. 為什么我們平時(shí)看到內(nèi)存地址是這樣的呢?如圖:

因?yàn)閮?nèi)存容量很大,容量大字節(jié)數(shù)自然也多了,所以需要更多位來編址內(nèi)存地址。上圖的(0x00 ...)內(nèi)存地址這里只是便于理解!

3. 為什么我那么菜呢?

哈哈哈......你心里沒點(diǎn)*數(shù)嗎?

關(guān)于內(nèi)存字節(jié)

  • 1個(gè)內(nèi)存地址只存1個(gè)字節(jié) (Byte);
  • 1個(gè)字節(jié)等于8位二進(jìn)制,每一位二進(jìn)制的0或1,叫“比特”(bit);
  • 比特是最小單位,字節(jié)是比特的集合,也是一個(gè)單位;

內(nèi)存給數(shù)據(jù)類型地址分配如下:

  • char:占一個(gè)字節(jié)分配一個(gè)地址;
  • int: 占四個(gè)字節(jié)分配四個(gè)地址;
  • 還有l(wèi)ong、float、double等類型,等著你來動(dòng)手測試。

可以使用sizeof進(jìn)行驗(yàn)證:

#include<stdio.h>
int main () {
 printf("sizeof(char)=%u\n",sizeof(char));
 printf("sizeof(int)=%u\n",sizeof(int));
return 0;
}

結(jié)果如下:

第二、理解指針

不要把指針想得太復(fù)雜,指針的實(shí)質(zhì)就是內(nèi)存“地址”,可以說指針就是地址,其實(shí)指針就是保存地址的變量。

拿普通變量跟指針變量做比較:

char a; // 定義一個(gè)變量a,用于保存char類型的數(shù)據(jù);
char *b; // 定義一個(gè)指針變量b,用于保存一個(gè)內(nèi)存地址,這個(gè)內(nèi)存地址上的數(shù)據(jù)必須是char類型的。

舉個(gè)例子,給指針變量進(jìn)行賦值:

#include<stdio.h>
int main () {
 char a = 5; // char 類型占一個(gè)字節(jié); 
 char *b = &a; // “&”是取變量的地址,取出a在內(nèi)存中的地址;
 // 賦值給b指針,此時(shí)b變量存儲(chǔ)的就是a地址。
 printf("我是a變量的值:%d\n",*b); // *b表示輸出b里面存儲(chǔ)的地址上的數(shù)據(jù); 
 // 證明b上存儲(chǔ)的是a的地址;
 printf("我是a的地址:%p\n",&a);
 printf("我是b變量的值:%p\n",b);
return 0;
}

輸出結(jié)果為:

我是a變量的值:5
我是a的地址:000000000062FE17
我是b變量的值:000000000062FE17

通過畫圖來理解:

通過指針間接性修改變量的值

char a = 5; 
char *b = &a;
printf("初始值:a=%d,*b=%d\n",a,*b);
*b = 12; // 其實(shí)操作的就是變量a本身的值;
printf("修改后:a=%d,*b=%d\n",a,*b);
------------------------------------------
輸出結(jié)果為:
初始值:a=5,*b=5
修改后:a=12,*b=12

指針類型的概念

我們知道char類型的數(shù)據(jù)只占一個(gè)字節(jié),有很多類型是需要多個(gè)字節(jié)來存儲(chǔ)的,像int類型的數(shù)據(jù)就需要四個(gè)字節(jié)來存儲(chǔ)(根據(jù)平臺(tái)不同,長度也有可能不一致)。

對(duì)于int類型的指針從當(dāng)前字節(jié)(地址)開始共四個(gè)字節(jié)(地址)都是屬于該變量的值, 而對(duì)于char類型則只表示當(dāng)前字節(jié)(地址)。代碼如下:

int a = 259;
int * p1 = &a;
char * p2 = (char *)&a; // 這里需要強(qiáng)制轉(zhuǎn)換一下類型
printf("*p1=%d,*p2=%d\n",*p1,*p2);
-----------------------
輸出:*p1=259,*p2=3

通過畫圖來便于理解:

通過上文我們已經(jīng)對(duì)int類型指針有所了解了,*p1的輸出是在我們預(yù)算范圍之內(nèi)的,但是為什么*p2輸出的值是3呢?

重點(diǎn),敲黑板?。?!

因?yàn)橛?jì)算機(jī)是使用二進(jìn)制來表示數(shù)字的,上面(259)十進(jìn)制轉(zhuǎn)換二進(jìn)制是 [100000011],由于一個(gè)int類型變量占用四個(gè)字節(jié),8位二進(jìn)制為一個(gè)字節(jié),補(bǔ)齊高位的0后,則 [00000000 00000000 00000001 00000011],每8位二進(jìn)制(一個(gè)字節(jié))換算為十進(jìn)制,則 [0  0  1  3]。

此時(shí)你應(yīng)該差不多明白*p2為什么輸出的值為3了吧,但是內(nèi)存地址中有個(gè)概念叫"

由于計(jì)算機(jī)讀取*p2的地址是0x00,所以直接輸出這個(gè)地址上的數(shù)據(jù),你也可以試著改一下,把259換成258/257等,看看是否正如所說。

驗(yàn)證它們存儲(chǔ)地址,代碼如下:

int a = 259;
int * p1 = &a;
char * p2 = (char *)&a;
printf("*p1=%d,*p2=%d\n",*p1,*p2);
printf("&a=0x%p\n",&a);
printf("p1=0x%p\n",p1);
printf("p2=0x%p\n",p2);

輸出結(jié)果正如我們預(yù)想的:

當(dāng)你看到這里的時(shí)候,你只是剛剛認(rèn)識(shí)指針而已,以上是我們俗稱的一級(jí)指針,一級(jí)指針是比較簡單的,還有二級(jí)指針和多級(jí)指針,更繞、更難理解,接下來介紹一下二級(jí)指針。

在講二級(jí)指針前,我們是否有疑問:什么是一級(jí)指針?什么是二級(jí)指針呢?兩者有什么區(qū)別呢?

一級(jí)指針存儲(chǔ)變量的地址,通過這個(gè)地址"直接獲取"變量的數(shù)據(jù)。二級(jí)指針存儲(chǔ)一級(jí)指針的地址,二級(jí)指針通過一級(jí)指針"間接獲取"獲取變量的數(shù)據(jù)。多級(jí)指針以此類推,個(gè)人理解,講的不對(duì)歡迎指正。

再堅(jiān)持一下,精彩在"下面"?。?![/滑稽]

二級(jí)指針

“指針的指針”也就是我們俗稱的二級(jí)指針。

什么是“指針的指針”,例如下面代碼:

char a = 5; 
char * p1 = &a;
char ** p2= &p1;
printf("*p=%d,**p2=%d\n",*p1,**p2); // 輸出:*p1=5,**p2=5

通過畫圖來理解:

多級(jí)指針也就是指針的指針的指針.....,以此類推即可。

第三、指針運(yùn)算問題

指針運(yùn)算是根據(jù)指針的類型不同而進(jìn)行運(yùn)算的,因類型的不同,在加1/減1操作時(shí),內(nèi)存分配的空間也不同。

又拿int類型和char類型來作比較,代碼如下:

char類型+1:從輸出結(jié)果可以看出地址是遞增1的,正符合char類型占一個(gè)字節(jié)的說法。

char c = 'h';
char *a = &c;
for (int i=0;i<3;i++){
 printf("a+1=0x%p\n",a + i);
}
--------------------------------
輸出結(jié)果:
a+1=0x000000000062FE0F
a+1=0x000000000062FE10
a+1=0x000000000062FE11

int類型+1:輸出的地址之間相差為4,正是int類型占據(jù)空間。

int c = 259;
int *a = &c;
for (int i=0;i<3;i++){
 printf("a+1=0x%p\n",a + i);
}
--------------------------------
輸出結(jié)果:
a+1=0x000000000062FE0C
a+1=0x000000000062FE10
a+1=0x000000000062FE14

char類型和int類型分別+1在內(nèi)存中地址分配,如圖:

指針就介紹到這里,這只是指針的基礎(chǔ),還有數(shù)組指針、指針數(shù)組、null指針、void指針等等知識(shí),還需要學(xué)習(xí),后續(xù)繼續(xù)更新。

以上有不恰當(dāng)或者講得不對(duì)的地方,希望各位留言指正,謝謝!

站在巨人的肩膀上!

總結(jié)

以上所述是小編給大家介紹的C語言指針及占據(jù)內(nèi)存空間,希望對(duì)大家有所幫助!

相關(guān)文章

  • C語言控制進(jìn)程之進(jìn)程等待詳解

    C語言控制進(jìn)程之進(jìn)程等待詳解

    這篇文章主要介紹了C語言控制進(jìn)程之進(jìn)程等待即回收子進(jìn)程的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • C語言入門篇--充分理解操作符

    C語言入門篇--充分理解操作符

    本篇文章是基礎(chǔ)篇,適合c語言剛?cè)腴T的朋友,本文主要介紹了c語言的操作符基礎(chǔ)理論,希望可以幫助大家快速入門c語言的世界,更好的理解c語言
    2021-08-08
  • C++的template模板中class與typename關(guān)鍵字的區(qū)別分析

    C++的template模板中class與typename關(guān)鍵字的區(qū)別分析

    這篇文章中我們來談一談C++的template模板中class與typename關(guān)鍵字的區(qū)別分析,同時(shí)會(huì)講到嵌套從屬名稱時(shí)的一些注意點(diǎn),需要的朋友可以參考下
    2016-06-06
  • C++深入探究用NULL來初始化空指針是否合適

    C++深入探究用NULL來初始化空指針是否合適

    在C++11新特性中,我們用nullptr來表示指針空值,這是為什么呢?好好地NULL為什么不繼續(xù)使用呢?說明在創(chuàng)造C++的大佬們一定發(fā)現(xiàn)了什么Bug,本篇我們就一起來討論一下吧
    2022-05-05
  • C語言實(shí)現(xiàn)bmp圖像對(duì)比度擴(kuò)展

    C語言實(shí)現(xiàn)bmp圖像對(duì)比度擴(kuò)展

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)bmp圖像對(duì)比度擴(kuò)展,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • C++ 逗號(hào)運(yùn)算符的具體使用

    C++ 逗號(hào)運(yùn)算符的具體使用

    本文主要介紹了C++ 逗號(hào)運(yùn)算符的具體使用,使用逗號(hào)運(yùn)算符是為了把幾個(gè)表達(dá)式放在一起,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-08-08
  • C語言中的遞歸,你真的懂了嗎?

    C語言中的遞歸,你真的懂了嗎?

    這篇文章主要給大家介紹了關(guān)于C語言中遞歸的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • C++11系列學(xué)習(xí)之類型推導(dǎo)

    C++11系列學(xué)習(xí)之類型推導(dǎo)

    這篇文章主要介紹了C++11系列學(xué)習(xí)之類型推導(dǎo),文章基于C++的相關(guān)資料展開對(duì)主題的詳細(xì)內(nèi)容介紹,具有一定的參考價(jià)值需要的小伙伴可參考一下
    2022-04-04
  • C語言實(shí)現(xiàn)酒店客房管理系統(tǒng)課程設(shè)計(jì)

    C語言實(shí)現(xiàn)酒店客房管理系統(tǒng)課程設(shè)計(jì)

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)酒店客房管理系統(tǒng)課程設(shè)計(jì),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • VS C++頭文件引用提示“未定義標(biāo)識(shí)符”的問題解決

    VS C++頭文件引用提示“未定義標(biāo)識(shí)符”的問題解決

    本文主要介紹了VS C++頭文件引用提示“未定義標(biāo)識(shí)符”的問題解決,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07

最新評(píng)論

根河市| 理塘县| 昆山市| 南投县| 潍坊市| 蛟河市| 郧西县| 闸北区| 吴江市| 西乌珠穆沁旗| 曲水县| 沙雅县| 高平市| 科技| 榆中县| 成安县| 西安市| 松江区| 历史| 青龙| 尚义县| 香格里拉县| 礼泉县| 古蔺县| 长汀县| 郯城县| 赫章县| 诏安县| 岢岚县| 广元市| 那曲县| 沙河市| 平顶山市| 涞水县| 高青县| 灵台县| 寿光市| 潍坊市| 明溪县| 汉沽区| 吉安市|