电竞比分网-中国电竞赛事及体育赛事平台

分享

16-高級(jí)指針

 昵稱10504424 2013-12-18

目錄:

一、高級(jí)指針

二、malloc函數(shù)

三、calloc函數(shù)

四、realloc函數(shù)

回到頂部

一、高級(jí)指針

1 堆內(nèi)存的動(dòng)態(tài)內(nèi)存分配。內(nèi)存分為:棧區(qū)(變量)、代碼區(qū)(字符串)、全局區(qū)(全局變量)、堆區(qū)(自己創(chuàng)建,自己回收,變量,字符串)

2 為了從堆中動(dòng)態(tài)分配內(nèi)存,要指定字節(jié)個(gè)數(shù)的空間,返回首地址,如果失敗,返回NULL(空)包含頭文件stdlib.h,基本的內(nèi)存操作都寫好了。

3 malloc函數(shù),從堆中分配指定的字節(jié)個(gè)數(shù)的空間,返回首地址,失敗返回NULL

4 calloc函數(shù),從堆中分配指定的字節(jié)個(gè)數(shù)的空間,把所分配的空間所有字節(jié)都清零,返回首地址,失敗返回NULL

5 realloc函數(shù),可以調(diào)整已經(jīng)分配的空間,有兩種情況,如果當(dāng)前位置可以調(diào)整,在原位置調(diào)整,如果當(dāng)前位置不可以調(diào)整,換一個(gè)新的位置。

6 free函數(shù),用于釋放從堆中分配的空間。

回到頂部

二、malloc函數(shù)

1 引入頭文件stdlib.h

2 堆中沒有變量名,只能通過指針的方式拿到內(nèi)存中的數(shù)據(jù)(值)

3 在使用堆內(nèi)存指針的時(shí)候,最好使用const關(guān)鍵字修飾一下。int* const p;

4 malloc函數(shù)可以分配堆內(nèi)存,以字節(jié)為單位的大小。

5 if (p != NULL) 這里避免內(nèi)存分配失敗,造成程序崩潰,非空驗(yàn)證。

6 堆內(nèi)存使用完畢后,一定要釋放。free(p);

回到頂部

三、calloc函數(shù)

前面跟malloc一樣。。。

7 calloc函數(shù)分配內(nèi)存時(shí),會(huì)做清零操作。

int* p = calloc(3, sizeof(int));

參數(shù)1是元素個(gè)數(shù) 參數(shù)2是每個(gè)元素空間

回到頂部

四、realloc函數(shù)

1 調(diào)整內(nèi)存空間。

2 標(biāo)準(zhǔn)格式:realloc(p, 5*sizeof(int));

可能出現(xiàn)的情況:

realloc(NULL, 5*sizeof(int));//參數(shù)1 調(diào)整哪個(gè)空間 參數(shù)2 調(diào)整后的大小

int* p = realloc(p, NULL);

3 如果直接把新分配的地址,直接覆蓋原來的地址,是有風(fēng)險(xiǎn)的,如果分配失敗,將無法將原來的地址找到,可以分配一個(gè)新地址。如果原來位置可以調(diào)整空間,如果不可以調(diào)整,程序會(huì)自動(dòng)在新的位置創(chuàng)建空間,并且將原來的值移動(dòng)到新的空間。

4 如果非空 就將新的位置保存到新的指針中。

練習(xí):(堆區(qū))創(chuàng)建3個(gè)位置,保存3個(gè)數(shù),修改十個(gè)位置,保存十個(gè)數(shù)。

復(fù)制代碼
 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 int main(int argc, const char * argv[])
 4 {
 5     //int number[3] = {0};
 6     //int* p = malloc(sizeof(int)*3);
 7     int* p = calloc(3, sizeof(int));//參數(shù)1是元素個(gè)數(shù) 參數(shù)2是每個(gè)元素空間
 8     //realloc重新分配空間
 9     int* p2 = realloc(p, 5*sizeof(int));//參數(shù)1 調(diào)整哪個(gè)空間 參數(shù)2 調(diào)整后的大小
10     printf("p address:%p\n",p);
11     printf("p2 address:%p\n",p2);
12     //int* p = realloc(p, NULL);
13     //printf("number address:%p\n",number);
14     printf("p address:%p\n",p);
15     if (p != NULL) {
16         p = p2;
17         for (int i = 0; i < 5; i++) {
18             printf("輸入一個(gè)數(shù):\n");
19             scanf("%d",p + i);
20         }
21         for (int i = 0; i < 5; i++) {
22             printf("%d\n",*(p + i));
23         }
24     }else{
25         printf("分配內(nèi)存不成功!");
26     }
27     free(p);//釋放內(nèi)存,否則會(huì)內(nèi)存泄露
28     return 0;
29 }
復(fù)制代碼

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

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多