亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Java > 正文

C語言指針的內存分配和Java中的引用

2019-11-06 06:34:30
字體:
來源:轉載
供稿:網友

核心內容: 1、C語言指針的核心知識點 2、處理指針相關問題的萬能措施—-內存分配圖 3、C語言的指針是如何過渡到java中的引用的


最近一段時間一直在學習C語言的指針,也算是頗有心得吧,雖然從網上看了幾篇關于指針的博文,但是感覺都不符合自己的口味,于是決定好好寫一篇關于指針的文章。 C語言指針的核心知識點: 1、指針就是地址,地址就是內存單元的編號,范圍是0到4G-1,指針的本質就是一個操作受限的非負整數,而指針變量就是存放內存單元編號(即地址、指針)的變量。 2、凡是動態分配的內存,都是沒有名字的,而是將其地址賦給一個指針變量,用指針變量去代表這個事物。 3、一個指針變量,無論其指向的變量占多少個字節,其本身只占用4個字節的內存空間,因為內存單元的編號是32位。32/8=4 4、字節是存儲數據的基本單元,一個字節占8位,而一個字節的編號占32位。 5、變量分為兩種類型:普通類型變量和指針類型變量,其中普通類型變量用來存放真實的數據,而指針類型變量用來存放變量的地址。其中指針類型變量包括(Java中): ①所有類定義的變量:如 Student student = new Student(“zhang” , 25),其中的student ②所有接口定義的變量:如 List list = new ArrayList(),其中的list ③數組的名字:如int a[] = {1,2,3,8,9}中的a。 6、靜態內存是在棧中進行分配的,是由系統自動分配、自動釋放的,靜態內存是程序員無法控制的;動態內存是在堆中進行分配的,是由程序員手動分配,手動釋放的,凡是動態分配的內存必須通過free的方式才能夠進行釋放,當然這里指的是C語言;在Java當中,動態分配的內存是由內存回收機制來回收的,不用程序員來進行手動回收,保證了程序的安全性,但是在Java當中,由于虛擬機要一直跟蹤每一塊內存空間的使用情況,所以往往會從造成CPU的使用率過大。 好的,如果你想學會C語言中的指針,上面的這些內容是你必須要理解的,首先我們先理解一下究竟什么是指針,在理解究竟什么是指針之前,我們必須要知道數據在內存中究竟是如何來進行存儲的,先放一張圖: 這里寫圖片描述 這里通過一個小例子來說明數據在內存中是如何來進行存儲的: 這里寫圖片描述 當我們在Visiual C++6.0軟件對這個程序進行編譯運行的時候,Visiual C++6.0這個軟件首先請求操作系統為我們的變量i分配一塊內存空間,隨后操作系統會在內存中尋找一塊空閑的區域分配給我們的程序,隨后Visiual C++6.0這個軟件會將變量i和我們的這塊內存空間關聯起來,今后對變量i的操作就是對我們內存空間的操作。具體實現過程如下: 這里寫圖片描述 現在我們對內存存儲的這一塊區域進行放大: 這里寫圖片描述 操作系統會給我們的變量分配一塊內存空間,但是這塊內存空間究竟在內存中的什么位置呢?這塊內存空間在內存空間中的編號到底是多少呢?現在讓我么在程序中輸出一下:

# include <stdio.h>int main(){    int i = 10;    PRintf("編號1的數值是:%#X/n",&i);    return 0;}1234567891012345678910

運行結果: 這里寫圖片描述 現在我們用圖畫在描述一下: 這里寫圖片描述 在上面這張圖中:這里寫圖片描述(即編號1)就是我們所說的指針,即地址,也就是說:指針實際上就是內存單元的編號,一個編號為32位,每一個內存單元都會占有一個內部單元的編號(即地址)記載其在內存條中的位置,因此通過指針我們可以直接對硬件進行操作。 其實,程序歸根結底就是對內存的操作,我們對一塊內存空間進行操作總共含有兩種方式: ①直接通過變量名的方式對這塊內存空間進行操作。(直接訪問) ②通過獲取內存空間的地址對這塊內存空間進行操作。(間接訪問) 這里寫圖片描述 其中,第一種方式是我們經常使用的,但是第二種方式會讓我們有一種直接接觸到硬件的感覺,示例程序:

# include <stdio.h>int main(){    int i = 10;    printf("編號1的數值是:%#X/n",&i);    int * p = &i; //指針變量p保存了變量i的地址:18FF44    *p = 100; //以18FF44為地址的那塊內存空間的內容設置為100    printf("變量i的內容是:%d/n",i);//無論是直接訪問還是以地址的間接訪問,本質上都是對同一塊內存空間的訪問    return 0;}1234567891011121314151612345678910111213141516

運行結果: 這里寫圖片描述 具體效果: 這里寫圖片描述 歸根接地就是一句話:無論是通過變量名i的直接訪問,還是通過地址18FF44的間接訪問,本質上都是對同一塊內存空間的訪問。


處理指針相關問題的萬能措施—-內存分配圖 很多人在處理指針這塊的程序的時候,有的時候總是會感覺到很迷糊,但是就我個人而言,對于指針相關的知識,總是習慣于去畫內存分配圖去解決問題,而且效果還是非常好的,下面我們就用一個典型的程序:交換內容的程序來說明問題。 要求:輸入a和b兩個整數,按照先大后小的順序輸出a和b。 實例程序1:

# include <stdio.h>void swap(int ,int );int main(){    int a,b;    printf("請從鍵盤上輸入a和b兩個數值:/n");    scanf("%d %d",&a,&b);    if (a < b)    {       swap(a,b);       }    printf("max=%d /t min=%d /n",a,b);    return 0;}void swap(int p,int q){    int tmp; //交換p和q的內容    tmp = p;    p = q;    q = tmp;}12345678910111213141516171819202122232425261234567891011121314151617181920212223242526

運行結果: 這里寫圖片描述 很明顯,從運行結果上來看,并沒有達到我們的預期效果,下面我們用內存分配圖來查找一下原因: 這里寫圖片描述 所以上面程序的解法是錯誤的。 實例程序2:

# include <stdio.h>void swap(int *,int *);int main(){    int a,b;    printf("請從鍵盤上輸入a和b兩個數值:/n");    scanf("%d %d",&a,&b);    if (a < b)    {       swap(&a,&b);     }    printf("max=%d /t min=%d /n",a,b);    return 0;}void swap(int *p,int *q){    int tmp;    tmp = *p;    *p = *q;    *q = tmp;}12345678910111213141516171819202122232425261234567891011121314151617181920212223242526

運行結果: 這里寫圖片描述 內存分配圖: 這里寫圖片描述 通過上面的圖解我們可以發現,指針變量p和q分別定位到了變量a和變量b的內存空間,間接的交換了a和b內存空間的內容。


C語言的指針是如何過渡到Java中的引用的 在談到這個問題的時候,我認為應該從兩個方面進行說起:動態內存分配和如何傳遞發送內容。 動態內存份分配的問題: 實例程序1:

# include <stdio.h># include <malloc.h># include <string.h>struct Student{   char name[100];   int age;   float score;};int main(){    Student * student = (Student *)malloc(sizeof(Student));    strcpy(student->name,"zhangming");    student->age = 25;    student->score = 88.8f;    printf("name is %s/n",student->name); //student->age在編譯底層會變為(*student).name    printf("age is %d/n",student->age);    printf("score is %f/n",student->score);    return 0;}1234567891011121314151617181920212223242512345678910111213141516171819202122232425

運行結果: 這里寫圖片描述 內存實例圖示: 這里寫圖片描述 對于上面的這個程序,Java語言是這么封裝的:

class Student {   String name;   int age;   float score;}public class App1 {    public static void main(String[] args)    {        //Student * student = (Student *)malloc(sizeof(Student));        Student student = new Student(); //new相當于C語言中的malloc        student.name = "zhangsan";        student.age = 25;        student.score = 88.8f;        System.out.println("name is:"+student.name);        System.out.println("age is:"+student.age);        System.out.println("score is:"+student.score);    }}123456789101112131415161718192021123456789101112131415161718192021

下面我們通過函數傳遞數據:傳遞指針變量(本質傳遞的是地址)

# include <stdio.h># include <malloc.h># include <string.h>struct Student{   char name[100];   int age;   float score;};void changeData(Student * stu){    strcpy(stu->name,"lisi");    stu->age = 24;    stu->score = 98.8f;}int main(){    Student * student = (Student *)malloc(sizeof(Student));    strcpy(student->name,"zhangming");    student->age = 25;    student->score = 88.8f;    printf("name is %s/n",student->name); //student->age在編譯底層會變為(*student).name    printf("age is %d/n",student->age);    printf("score is %f/n",student->score);    changeData(student);//傳遞的是地址,速度快并且節省內存空間!    printf("name is %s/n",student->name); //student->age在編譯底層會變為(*student).name    printf("age is %d/n",student->age);    printf("score is %f/n",student->score);    return 0;}123456789101112131415161718192021222324252627282930313233343536123456789101112131415161718192021222324252627282930313233343536

運行結果: 這里寫圖片描述 Java封裝的效果:

class Student {   String name;   int age;   float score;}public class App1 {    public static void main(String[] args)    {        //Student * student = (Student *)malloc(sizeof(Student));        Student student = new Student(); //new相當于C語言中的malloc        student.name = "zhangsan";        student.age = 25;        student.score = 88.8f;        System.out.println("name is:"+student.name);        System.out.println("age is:"+student.age);        System.out.println("score is:"+student.score);        changeData(student); //student本質上是一個指針變量        System.out.println("name is:"+student.name);        System.out.println("age is:"+student.age);        System.out.println("score is:"+student.score);    }    public static void changeData(Student stu) //stu指向同一塊內存空間    {        stu.name = "lisi";        stu.age = 24;        stu.score = 98.8f;    }}123456789101112131415161718192021222324252627282930313233123456789101112131415161718192021222324252627282930313233

運行結果:

name is:zhangsanage is:25score is:88.8name is:lisiage is:24score is:98.8123456123456

總結:在Java當中,雖然已經沒有了指針,但是底層編譯運行過程中本質上就是指針,Java中的引用本質上就是C語言中的指針變量,無論是C語言還是Java語言,都有一個共同的特點:凡是動態分配的內存都是沒有名字的,而是用一個指針變量保存這塊內存空間的地址,用這個指針變量去代表這塊內存空間。 


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩精品中文字幕有码专区| 全色精品综合影院| 亚洲精品视频播放| 国产精品久久久久久网站| 国产精品视频网站| 国产日韩精品一区二区| 国产精品国产三级国产aⅴ浪潮| 国产精品va在线播放我和闺蜜| 久久精品国产亚洲| 亚洲成人激情图| 亚洲 日韩 国产第一| 2019中文字幕全在线观看| 久久人人爽人人爽人人片av高请| 久久99热这里只有精品国产| 精品国产乱码久久久久酒店| 日韩视频在线免费观看| 精品女厕一区二区三区| 自拍视频国产精品| 国产福利视频一区二区| 国产精品成人播放| 亚洲在线免费视频| 久久久免费精品视频| 久久久人成影片一区二区三区| 91成人性视频| 欧美成人免费va影院高清| 欧美日韩国产限制| 成人免费看吃奶视频网站| 欧美猛男性生活免费| 九九九久久久久久| 欧美性受xxxx白人性爽| 亚洲美腿欧美激情另类| 成人午夜激情网| 日韩av免费看| 国外成人在线直播| 亚洲色图在线观看| 成人黄色午夜影院| 日韩大片在线观看视频| 日韩欧美亚洲范冰冰与中字| 国产成人综合精品在线| 欧美小视频在线| 中文字幕自拍vr一区二区三区| 欧美激情免费在线| 久久精品视频在线| 久久久国产精品亚洲一区| 欧美与欧洲交xxxx免费观看| 日韩在线资源网| 国产成人亚洲综合91| 欧美最近摘花xxxx摘花| 日本免费在线精品| 97在线视频精品| 97超碰蝌蚪网人人做人人爽| 久久免费少妇高潮久久精品99| 欧美日韩国产成人在线观看| 欧美大尺度激情区在线播放| 黑人极品videos精品欧美裸| 欧美夫妻性视频| 亚洲欧美综合精品久久成人| 欧美激情18p| 欧美日韩精品二区| 九色精品免费永久在线| 亚洲伦理中文字幕| 2018国产精品视频| 亚洲欧美国产精品va在线观看| 中文字幕日本精品| 色爱精品视频一区| 九九久久精品一区| 在线中文字幕日韩| 欧美国产日韩中文字幕在线| 色偷偷av一区二区三区乱| 国产激情综合五月久久| 欧美成人网在线| 欧美激情一区二区三级高清视频| 九九热最新视频//这里只有精品| 日本久久91av| 久久久天堂国产精品女人| 国产精品亚洲一区二区三区| 国产精品久久久久久久一区探花| 亚洲视频日韩精品| 激情亚洲一区二区三区四区| 久久69精品久久久久久国产越南| 欧美日韩国产区| 亚洲色图日韩av| 久久久精品久久| 97精品一区二区三区| 中文字幕视频在线免费欧美日韩综合在线看| 国产美女精彩久久| 国产日韩在线观看av| 在线日韩中文字幕| 亚洲最大福利视频网| 亚洲精品久久久久久久久| 国产美女精品视频免费观看| 欧美日韩性视频| 91精品在线影院| 欧美午夜宅男影院在线观看| 成人免费激情视频| 亚洲电影在线观看| 在线播放精品一区二区三区| 欧美肥臀大乳一区二区免费视频| 欧美极品在线播放| 国产欧美精品在线播放| 成人午夜黄色影院| 欧美性在线观看| x99av成人免费| 免费91在线视频| 亚洲午夜色婷婷在线| 伊人久久久久久久久久久久久| 精品少妇一区二区30p| 日韩av在线一区| 97色在线观看免费视频| 欧美人与性动交a欧美精品| 欧美另类极品videosbestfree| 日本韩国欧美精品大片卡二| 国产精品大陆在线观看| 黑人巨大精品欧美一区二区免费| 2025国产精品视频| 久久精品影视伊人网| 国产午夜精品视频免费不卡69堂| 亚洲男女性事视频| 欧美一级大片在线免费观看| 成人免费网站在线观看| 亚洲天堂2020| 亚洲第一级黄色片| 久久99精品久久久久久琪琪| 日韩精品亚洲视频| 国产精品xxxxx| 91精品久久久久久久久久久| 亚洲二区中文字幕| 日产日韩在线亚洲欧美| 2019中文字幕全在线观看| 国产第一区电影| 欧美性极品xxxx做受| 成人在线视频福利| 亚洲欧美日韩天堂一区二区| 久久成人一区二区| 中文在线资源观看视频网站免费不卡| 国产精品美女午夜av| 狠狠色香婷婷久久亚洲精品| 成人免费网站在线看| 亚洲丝袜av一区| 国产精品精品国产| 国产视频久久久久久久| 久久久久久亚洲精品不卡| 成人免费视频在线观看超级碰| 亚洲国产成人精品久久| 97视频在线观看网址| 亚洲第一av在线| 亚洲人成电影网站色www| 久久精品免费电影| 91欧美精品成人综合在线观看| 日韩理论片久久| 国产精品永久在线| 欧美一级黑人aaaaaaa做受| 性欧美办公室18xxxxhd| 亚洲毛片在线免费观看| 亚洲一区二区三区xxx视频| 日本成熟性欧美| 欧美精品久久久久久久久| 日韩网站免费观看| 亚洲欧美中文日韩在线v日本| 日韩欧美成人网| 岛国视频午夜一区免费在线观看| 6080yy精品一区二区三区| 久久久久久欧美| 亚洲精品久久久久中文字幕二区|