溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

梓益C語(yǔ)言學(xué)習(xí)筆記之鏈表&動(dòng)態(tài)內(nèi)存&文件

發(fā)布時(shí)間:2020-07-02 19:39:37 來(lái)源:網(wǎng)絡(luò) 閱讀:446 作者:Czyy1 欄目:編程語(yǔ)言

梓益C語(yǔ)言學(xué)習(xí)筆記之鏈表&動(dòng)態(tài)內(nèi)存&文件

一、定義:

鏈表是一種物理存儲(chǔ)上非連續(xù),通過(guò)指針鏈接次序,實(shí)現(xiàn)的一種線性存儲(chǔ)結(jié)構(gòu)。

二、特點(diǎn):

鏈表由一系列節(jié)點(diǎn)(鏈表中每一個(gè)元素稱為節(jié)點(diǎn))組成,節(jié)點(diǎn)在運(yùn)行時(shí)動(dòng)態(tài)生成(malloc),每個(gè)節(jié)點(diǎn)包括兩個(gè)部分:

存儲(chǔ)數(shù)據(jù)元素的數(shù)據(jù)域

存儲(chǔ)下一個(gè)節(jié)點(diǎn)地址的指針域

如:

  typedef struct student

  {  

int num;

char name[20];

struct student *next;

    }STU;

三、動(dòng)態(tài)內(nèi)存申請(qǐng)

在實(shí)際的編程中,有時(shí)所需的內(nèi)存空間取決于實(shí)際輸入的數(shù)據(jù),無(wú)法預(yù)先確定 ,所以需要?jiǎng)討B(tài)的分配內(nèi)存空間,同時(shí)把不再使用的空間回收再次利用。

如鏈表的內(nèi)存就需要?jiǎng)討B(tài)申請(qǐng)


1. 靜態(tài)分配&動(dòng)態(tài)分配

靜態(tài)分配

在程序編譯或運(yùn)行過(guò)程中,按事先規(guī)定大小分配內(nèi)存空間的分配方式。如:int a [10]

必須事先知道所需空間的大小。

分配在棧區(qū)或全局變量區(qū),一般以數(shù)組的形式。

按計(jì)劃分配。

動(dòng)態(tài)分配

在程序運(yùn)行過(guò)程中,根據(jù)需要大小自由分配所需空間。

按需分配。

分配在堆區(qū),一般使用特定的函數(shù)進(jìn)行分配。

通常使用malloc函數(shù)     void *malloc(unsigned int size);   在堆區(qū)分配一塊長(zhǎng)度為size字節(jié)的連續(xù)區(qū)域,用來(lái)存放類型說(shuō)明符指定的類型。

函數(shù)返回void*指針,使用時(shí)必須做相應(yīng)的強(qiáng)制類型轉(zhuǎn)換 

分配的內(nèi)存空間內(nèi)容不確定,一般使用memset初始化。

使用完以后,要記得用  free()函數(shù)  釋放內(nèi)存 

返回值:分配空間的起始地址 ( 分配成功 )

 NULL                          ( 分配失敗 )

注意

1、在調(diào)用malloc之后,一定要判斷一下,是否申請(qǐng)內(nèi)存成功。

2、如果多次malloc申請(qǐng)的內(nèi)存,第1次和第2次申請(qǐng)的內(nèi)存不一定是連續(xù)的

例:

#include<stdlib.h>

#include<stdio.h>

#include<string.h>

int main()

{

int count,*array,n;

printf("請(qǐng)輸入您要申請(qǐng)的數(shù)組元素個(gè)數(shù)\n");

scanf("%d",&n);

array=(int *)malloc(n*sizeof(int));

if(array==NULL)

{

printf("申請(qǐng)內(nèi)存失敗\n");

return 0;

}

memset(array,0,n*sizeof(int));

for(count=0;count<n;count++)

{

array[count]=count;

}

for(count=0;count<n;count++)

{

printf("%d\n",array[count]);

}


free(array);//釋放array指向的內(nèi)存


return0

}

free 函數(shù)(釋放內(nèi)存函數(shù))

頭文件:#include<stdlib.h>

函數(shù)定義:void free(void *ptr)

函數(shù)說(shuō)明:free函數(shù)釋放ptr指向的內(nèi)存。

例:

char *p=(char *)malloc(100);

free(p);// 

注意

1、free后,因?yàn)闆]有給p賦值,所以p還是指向原先動(dòng)態(tài)申請(qǐng)的內(nèi)存。但是內(nèi)存已經(jīng)不能再用了,p變成野指針了。

2、一塊動(dòng)態(tài)申請(qǐng)的內(nèi)存只能free一次,不能多次free


四、文件

文件就是存放在磁盤上的,一些數(shù)據(jù)的集合。

1.行緩沖:

標(biāo)準(zhǔn)io庫(kù)函數(shù),往標(biāo)準(zhǔn)輸出(屏幕)輸出東西的時(shí)候是行緩沖的

  行緩沖只有下面幾種情況才刷新緩沖區(qū)

  1-緩沖區(qū)里有換行符  "\n"

2-緩沖區(qū)滿了,自動(dòng)刷新緩沖區(qū)

如: while(1)

{

printf("hello world ");

}

3-人為刷新緩沖區(qū) fflush(stdout)

4-程序正常結(jié)束,刷新緩沖區(qū) return 0;


2.全緩沖:

標(biāo)準(zhǔn)io庫(kù)函數(shù) 往普通文件讀寫數(shù)據(jù)是全緩沖的,

碰到換行符也不刷新緩沖區(qū)

1.緩沖區(qū)滿了,刷新緩沖區(qū)

2.人為刷新緩沖區(qū) fflush(文件指針)

3.程序正常結(jié)束刷新緩沖區(qū)

3.無(wú)緩沖:

在讀寫文件的時(shí)候通過(guò)系統(tǒng)調(diào)用io (read write),對(duì)文件進(jìn)行讀寫數(shù)據(jù)是無(wú)緩沖的,即寫數(shù)據(jù)會(huì)立馬進(jìn)入文件,讀數(shù)據(jù)會(huì)立馬進(jìn)入內(nèi)存


4.寫文件的流程:

應(yīng)用程序空間-(內(nèi)核空間 -(驅(qū)動(dòng)程序--(硬盤

應(yīng)用程序和內(nèi)核程序運(yùn)行在不同的空間里,目的是為了保護(hù)內(nèi)核。

通過(guò)緩沖可以減少進(jìn)出內(nèi)核的次數(shù),以提高效率。


5.常用文件操作:

5.1 打開文件:FILE *fopen(const char *path, const char *mode);

FILE *fp;

fp=fopen(“./test.txt”,”r”);

5.2 關(guān)閉文件:int fclose(FILE *fp);

例:

#include<stdio.h>

int main()

{

FILE *fp;

int ret;

fp=fopen("./test.txt","r+");

if(fp==NULL)

{

perror(“fopen”);

return 0;

}

fclose(fp);

return 0;

}


5.3 文件定位:

rewind 復(fù)位讀寫位置

把文件內(nèi)部的位置指針移到文件首 

rewind(fp);


ftell 測(cè)文件讀寫位置距文件開始有多少個(gè)字節(jié)

  int length;   length = ftell(fp); 


fseek 定位位置指針(讀寫位置)

fseek函數(shù)(一般用于二進(jìn)制文件即打開文件的方式需要帶b)

int fseek(FILE *stream, long offset, int whence);  //int fseek(文件類型指針,位移量,起始點(diǎn)); 

參數(shù):

whence起始位置 

文件開頭         SEEK_SET     0

文件當(dāng)前位置     SEEK_CUR     1

文件末尾         SEEK_END     2

offset位移量:

以起始點(diǎn)為基點(diǎn),向前、后移動(dòng)的字節(jié)數(shù),正數(shù)往文件末尾方向偏移,負(fù)數(shù)往文件開頭方向偏移。

例:

fseek(fp,50,SEEK_SET)

fseek(fp,-50,SEEK_END);

fseek(fp,0,SEEK_END);


向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI