梓益C语言学习笔记之链表&动态内存&文件
梓益C語言學(xué)習(xí)筆記之鏈表&動態(tài)內(nèi)存&文件
一、定義:
鏈表是一種物理存儲上非連續(xù),通過指針鏈接次序,實(shí)現(xiàn)的一種線性存儲結(jié)構(gòu)。
二、特點(diǎn):
鏈表由一系列節(jié)點(diǎn)(鏈表中每一個元素稱為節(jié)點(diǎn))組成,節(jié)點(diǎn)在運(yùn)行時動態(tài)生成(malloc),每個節(jié)點(diǎn)包括兩個部分:
存儲數(shù)據(jù)元素的數(shù)據(jù)域
存儲下一個節(jié)點(diǎn)地址的指針域
如:
typedef struct student
{ ?
int num;
char name[20];
struct student *next;
? ? }STU;
三、動態(tài)內(nèi)存申請
在實(shí)際的編程中,有時所需的內(nèi)存空間取決于實(shí)際輸入的數(shù)據(jù),無法預(yù)先確定 ,所以需要動態(tài)的分配內(nèi)存空間,同時把不再使用的空間回收再次利用。
如鏈表的內(nèi)存就需要動態(tài)申請
1. 靜態(tài)分配&動態(tài)分配
靜態(tài)分配
在程序編譯或運(yùn)行過程中,按事先規(guī)定大小分配內(nèi)存空間的分配方式。如:int a [10]
必須事先知道所需空間的大小。
分配在棧區(qū)或全局變量區(qū),一般以數(shù)組的形式。
按計劃分配。
動態(tài)分配
在程序運(yùn)行過程中,根據(jù)需要大小自由分配所需空間。
按需分配。
分配在堆區(qū),一般使用特定的函數(shù)進(jìn)行分配。
通常使用malloc函數(shù) ? ? void *malloc(unsigned int size); ? 在堆區(qū)分配一塊長度為size字節(jié)的連續(xù)區(qū)域,用來存放類型說明符指定的類型。
函數(shù)返回void*指針,使用時必須做相應(yīng)的強(qiáng)制類型轉(zhuǎn)換?
分配的內(nèi)存空間內(nèi)容不確定,一般使用memset初始化。
使用完以后,要記得用 ?free()函數(shù) ?釋放內(nèi)存?
返回值:分配空間的起始地址 ( 分配成功 )
?NULL ? ? ? ? ? ? ? ? ? ? ? ? ?( 分配失敗 )
注意
1、在調(diào)用malloc之后,一定要判斷一下,是否申請內(nèi)存成功。
2、如果多次malloc申請的內(nèi)存,第1次和第2次申請的內(nèi)存不一定是連續(xù)的
例:
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
int main()
{
int count,*array,n;
printf("請輸入您要申請的數(shù)組元素個數(shù)\n");
scanf("%d",&n);
array=(int *)malloc(n*sizeof(int));
if(array==NULL)
{
printf("申請內(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ù)說明:free函數(shù)釋放ptr指向的內(nèi)存。
例:
char *p=(char *)malloc(100);
free(p);//?
注意
1、free后,因?yàn)闆]有給p賦值,所以p還是指向原先動態(tài)申請的內(nèi)存。但是內(nèi)存已經(jīng)不能再用了,p變成野指針了。
2、一塊動態(tài)申請的內(nèi)存只能free一次,不能多次free
四、文件
文件就是存放在磁盤上的,一些數(shù)據(jù)的集合。
1.行緩沖:
標(biāo)準(zhǔn)io庫函數(shù),往標(biāo)準(zhǔn)輸出(屏幕)輸出東西的時候是行緩沖的
? 行緩沖只有下面幾種情況才刷新緩沖區(qū)
? 1-緩沖區(qū)里有換行符 ?"\n"
2-緩沖區(qū)滿了,自動刷新緩沖區(qū)
如: while(1)
{
printf("hello world ");
}
3-人為刷新緩沖區(qū) fflush(stdout)
4-程序正常結(jié)束,刷新緩沖區(qū) return 0;
2.全緩沖:
標(biāo)準(zhǔn)io庫函數(shù) 往普通文件讀寫數(shù)據(jù)是全緩沖的,
碰到換行符也不刷新緩沖區(qū)
1.緩沖區(qū)滿了,刷新緩沖區(qū)
2.人為刷新緩沖區(qū) fflush(文件指針)
3.程序正常結(jié)束刷新緩沖區(qū)
3.無緩沖:
在讀寫文件的時候通過系統(tǒng)調(diào)用io (read write),對文件進(jìn)行讀寫數(shù)據(jù)是無緩沖的,即寫數(shù)據(jù)會立馬進(jìn)入文件,讀數(shù)據(jù)會立馬進(jìn)入內(nèi)存
4.寫文件的流程:
應(yīng)用程序空間-(內(nèi)核空間 -(驅(qū)動程序--(硬盤
應(yīng)用程序和內(nèi)核程序運(yùn)行在不同的空間里,目的是為了保護(hù)內(nèi)核。
通過緩沖可以減少進(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 測文件讀寫位置距文件開始有多少個字節(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),向前、后移動的字節(jié)數(shù),正數(shù)往文件末尾方向偏移,負(fù)數(shù)往文件開頭方向偏移。
例:
fseek(fp,50,SEEK_SET)
fseek(fp,-50,SEEK_END);
fseek(fp,0,SEEK_END);
轉(zhuǎn)載于:https://blog.51cto.com/13603157/2082832
總結(jié)
以上是生活随笔為你收集整理的梓益C语言学习笔记之链表&动态内存&文件的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C/C++返回内部静态成员的陷阱
- 下一篇: 导出toolStrip1中的图标