您好,登錄后才能下訂單哦!
梓益C語言學習筆記之鏈表&動態內存&文件
一、定義:
鏈表是一種物理存儲上非連續,通過指針鏈接次序,實現的一種線性存儲結構。
二、特點:
鏈表由一系列節點(鏈表中每一個元素稱為節點)組成,節點在運行時動態生成(malloc),每個節點包括兩個部分:
存儲數據元素的數據域
存儲下一個節點地址的指針域
如:
typedef struct student
{
int num;
char name[20];
struct student *next;
}STU;
三、動態內存申請
在實際的編程中,有時所需的內存空間取決于實際輸入的數據,無法預先確定 ,所以需要動態的分配內存空間,同時把不再使用的空間回收再次利用。
如鏈表的內存就需要動態申請
1. 靜態分配&動態分配
靜態分配
在程序編譯或運行過程中,按事先規定大小分配內存空間的分配方式。如:int a [10]
必須事先知道所需空間的大小。
分配在棧區或全局變量區,一般以數組的形式。
按計劃分配。
動態分配
在程序運行過程中,根據需要大小自由分配所需空間。
按需分配。
分配在堆區,一般使用特定的函數進行分配。
通常使用malloc函數 void *malloc(unsigned int size); 在堆區分配一塊長度為size字節的連續區域,用來存放類型說明符指定的類型。
函數返回void*指針,使用時必須做相應的強制類型轉換
分配的內存空間內容不確定,一般使用memset初始化。
使用完以后,要記得用 free()函數 釋放內存
返回值:分配空間的起始地址 ( 分配成功 )
NULL ( 分配失敗 )
注意
1、在調用malloc之后,一定要判斷一下,是否申請內存成功。
2、如果多次malloc申請的內存,第1次和第2次申請的內存不一定是連續的
例:
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
int main()
{
int count,*array,n;
printf("請輸入您要申請的數組元素個數\n");
scanf("%d",&n);
array=(int *)malloc(n*sizeof(int));
if(array==NULL)
{
printf("申請內存失敗\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指向的內存
return0
}
free 函數(釋放內存函數)
頭文件:#include<stdlib.h>
函數定義:void free(void *ptr)
函數說明:free函數釋放ptr指向的內存。
例:
char *p=(char *)malloc(100);
free(p);//
注意
1、free后,因為沒有給p賦值,所以p還是指向原先動態申請的內存。但是內存已經不能再用了,p變成野指針了。
2、一塊動態申請的內存只能free一次,不能多次free
四、文件
文件就是存放在磁盤上的,一些數據的集合。
1.行緩沖:
標準io庫函數,往標準輸出(屏幕)輸出東西的時候是行緩沖的
行緩沖只有下面幾種情況才刷新緩沖區
1-緩沖區里有換行符 "\n"
2-緩沖區滿了,自動刷新緩沖區
如: while(1)
{
printf("hello world ");
}
3-人為刷新緩沖區 fflush(stdout)
4-程序正常結束,刷新緩沖區 return 0;
2.全緩沖:
標準io庫函數 往普通文件讀寫數據是全緩沖的,
碰到換行符也不刷新緩沖區
1.緩沖區滿了,刷新緩沖區
2.人為刷新緩沖區 fflush(文件指針)
3.程序正常結束刷新緩沖區
3.無緩沖:
在讀寫文件的時候通過系統調用io (read write),對文件進行讀寫數據是無緩沖的,即寫數據會立馬進入文件,讀數據會立馬進入內存
4.寫文件的流程:
應用程序空間-(內核空間 -(驅動程序--(硬盤
應用程序和內核程序運行在不同的空間里,目的是為了保護內核。
通過緩沖可以減少進出內核的次數,以提高效率。
5.常用文件操作:
5.1 打開文件:FILE *fopen(const char *path, const char *mode);
FILE *fp;
fp=fopen(“./test.txt”,”r”);
5.2 關閉文件: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 復位讀寫位置
把文件內部的位置指針移到文件首
rewind(fp);
ftell 測文件讀寫位置距文件開始有多少個字節
int length; length = ftell(fp);
fseek 定位位置指針(讀寫位置)
fseek函數(一般用于二進制文件即打開文件的方式需要帶b)
int fseek(FILE *stream, long offset, int whence); //int fseek(文件類型指針,位移量,起始點);
參數:
whence起始位置
文件開頭 SEEK_SET 0
文件當前位置 SEEK_CUR 1
文件末尾 SEEK_END 2
offset位移量:
以起始點為基點,向前、后移動的字節數,正數往文件末尾方向偏移,負數往文件開頭方向偏移。
例:
fseek(fp,50,SEEK_SET)
fseek(fp,-50,SEEK_END);
fseek(fp,0,SEEK_END);
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。