您好,登錄后才能下訂單哦!
梓益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);
免責(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)容。